以递归方式从对象中删除值列表

时间:2017-08-16 17:23:14

标签: javascript object recursion

我有一个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
无法找到任何错误

2 个答案:

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