我有一个id列表
ids = [6,9]
和一个对象数组
data = {
"child": [{
"fruit": "apple",
"id": 1
},
{
"fruit": "mango",
"id": 2,
"child": [{
"name": "js",
"id": 4
}, {
"name": "jsk",
"id": 6
}]
},
{
"fruit": "banana",
"id": 9
}
]
}
我必须迭代数据才能找到id列表中存在id的任何对象。我必须删除
{"name":"jsk", "id": 6}
和
{"fruit":"banana","id":9}
为实现这一点,我写了以下代码
deleteObj = (data, ids) => {
data.child.forEach((key, index) => {
if(key && ids.indexOf(child.id) > -1){
console.log("inside match before", key);
key.splice(index, 1);
console.log("inside match after: ", key);
}
if(key.child) {
deleteObj(key, ids);
}
})
};
但是在获得第一场比赛后的这个函数中,它只是返回。只允许第一个匹配的id。
仅Pring inside match after:9
无法找到任何错误
答案 0 :(得分:1)
当你循环并删除元素形式的原始数组时,你会遇到一个问题,因为数组正在被重新索引,你跳过了一些元素,所以你可以反向循环。
var data = {"child":[{"fruit":"apple","id":1},{"fruit":"mango","id":2,"child":[{"name":"js","id":4},{"name":"jsk","id":6}]},{"fruit":"banana","id":9}]}
function deleteById(data, ids) {
if (Array.isArray(data)) {
var i = data.length - 1;
while (i > 0) {
if (ids.includes(data[i].id)) data.splice(i, 1)
deleteById(data[i], ids)
i -= 1;
}
} else if (typeof data == 'object') {
for (var i in data) {
if (typeof data[i] == 'object') deleteById(data[i], ids)
}
}
}
deleteById(data, [6, 9])
console.log(data)

答案 1 :(得分:1)
你可以使用一个简单的while
循环并从最后进行迭代,因为拼接删除了实际的索引,并且继续前进,你得到一个未经处理的项目。
function deleteItems(array, ids) {
var i = array.length;
while (i--) {
if (ids.indexOf(array[i].id) !== -1) {
array.splice(i, 1);
continue;
}
array[i].child && deleteItems(array[i].child, ids);
}
}
var ids = [6, 9],
data = { child: [{ fruit: "apple", id: 1 }, { fruit: "mango", id: 2, child: [{ name: "js", id: 4 }, { name: "jsk", id: 6 }] }, { fruit: "banana", id: 9 }] };
deleteItems([data], ids)
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }