如何根据嵌套对象的signature字段值过滤移除数组对应上层元素
实现思路
核心方案是直接对schedule_column_values数组做过滤,只保留符合规则的元素,不需要做unset或者设NULL操作,完全符合业务要求。
- 遍历最外层数组的每个顶层对象
- 对每个顶层对象的
schedule_column_values字段做过滤,过滤规则为:仅保留field_value.field.signature不等于目标排除值的元素 - 过滤后直接将新数组赋值回原字段即可
你之前用foreach+unset不生效通常是两种原因:一是foreach遍历的是数组副本没有用引用,修改没有落到原数据上;二是unset后数组索引没有重置,后续操作的时候出现异常。用过滤后直接赋值的方案可以完全规避这两个问题。
代码示例
PHP 实现
// $targetSignature 是你要排除的signature值,可自定义为任意字符串 $targetSignature = 'android'; foreach ($data as &$item) { $item['schedule_column_values'] = array_filter( $item['schedule_column_values'], function ($column) use ($targetSignature) { return $column['field_value']['field']['signature'] !== $targetSignature; } ); // 重置数组索引,避免出现非连续索引的问题 $item['schedule_column_values'] = array_values($item['schedule_column_values']); } unset($item); // 解除引用避免后续操作异常
如果你的数据是对象格式不是数组格式,把数组的中括号改成箭头调用即可,比如$item->schedule_column_values、$column->field_value->field->signature。
JavaScript 实现
// targetSignature 为要排除的signature值,可自定义为任意字符串 const targetSignature = 'android'; const processedData = data.map(item => { return { ...item, schedule_column_values: item.schedule_column_values.filter(column => { return column.field_value.field.signature !== targetSignature }) } })
如果不需要保留原数据,也可以直接遍历修改原对象的schedule_column_values字段。
内容的提问来源于stack exchange,提问作者Nish Dekardo
相关产品推荐
相关产品推荐

