2017-08-16 96 views
2

删除值的列表我具有如递归从对象

ids = [6,9] 

ID的列表和一个对象,它是作为

data = { 
    "child": [{ 
      "fruit": "apple", 
      "id": 1 
     }, 
     { 
      "fruit": "mango", 
      "id": 2, 
      "child": [{ 
       "name": "js", 
       "id": 4 
      }, { 
       "name": "jsk", 
       "id": 6 
      }] 
     }, 
     { 
      "fruit": "banana", 
      "id": 9 
     } 
    ] 
} 

我必须遍历数据,以找到对象的数组在ids.Here名单与现有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); 
    } 
    }) 
}; 

但在获得第一后,此功能匹配它只是return.Deliting只有第一个匹配的ID。 普林只有inside match after:9
无法找到任何错误

+0

是什么'findBookmarkDeletedIds' – Dij

+0

你有deleteObj内的两个问题。在第一个if语句中,你检查'child.id',但你应该检查'key.id'。其次,你的拼接调用应该在data.child而不是'key'上调用。 – vox

回答

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; }

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)