如何从动态生成的Json对象中删除值

时间:2017-09-25 08:22:31

标签: javascript arrays json



{
        "1": {
            "0": [
                7606,
                7615,
                7596,
                7513,
                7514,
                7597,
                7605,
                7607,
                7608,
                7595
            ],
            "87": [
                7514,
                7605,
                7644,
                7607,
                7608
            ]
        },
         "2": {
            "0": [
                7573,
                7605,
                7572,
                7569
            ]
         },
         "3": { ....

}




我有以下演示Json数组。注意 - 12 ...

内也可能有其他对象

我需要删除包含在给定数组[7605,7608,7615,7573]中匹配的任何值的数组元素的值。我需要从上面的json数组中删除所有这些值。

如何递归遍历以下数组并从对象的叶子数组中删除所有这些值。

对于上述输入,输出应为

{
        "1": {
            "0": [
                7606,
                7596,
                7513,
                7514,
                7597,
                7607,
                7595
            ],
            "87": [
                7514,
                7644,
                7607
            ]
        },
         "2": {
            "0": [
                7568,
                7572,
                7569
            ]
         }
}

我尝试使用Object.keys,但我对json的动态特性感到困惑。

2 个答案:

答案 0 :(得分:2)

正确地指出Object.keys()有助于为这样的动态对象实现解决方案,但这是正确的,但这是一种可能的递归实现,使用Object.entries()代替:

function filterObject(o, v) {
  return Object
    .entries(o).map(([key, value]) => {
      if (Array.isArray(value)) {
        value = value.filter(n => !v.includes(n))
      } else {
        value = filterObject(value, v)
      }

      return [key, value]
    })
    .reduce((o, [key, value]) => {
      return Object.assign(o, {
        [key]: value
      })
    }, {})
}

console.log(filterObject({
  "1": {
    "0": [
      7606,
      7615,
      7596,
      7513,
      7514,
      7597,
      7605,
      7607,
      7608,
      7595
    ],
    "87": [
      7514,
      7605,
      7644,
      7607,
      7608
    ]
  },
  "2": {
    "0": [
      7573,
      7605,
      7572,
      7569
    ]
  }
}, [7605, 7608, 7615, 7573]))

MDN用于各种功能的polyfills:

答案 1 :(得分:1)

您可以使用filter方法接受回调功能并结合Object.keys方法。

forEach()方法为每个数组元素执行一次提供的函数。

indexOf()用于返回在数组中可以找到给定元素的第一个索引,如果不存在则返回-1。

filter方法会创建一个 new 数组,其中包含通过提供的函数实施的测试的所有元素。

forEach用于迭代对象键,然后使用filter方法从数组中移除项目(这些项目也存在于给定数组中) [7605,7608,7615,7573])。

此外,您可以使用includes方法检查给定数组中是否存在项目。

json[key][subkey]=json[key][subkey].filter(function(item){
  return !array.includes(item);
});



let array=[7605,7608,7615,7573];
let json={
        "1": {
            "0": [
                7606,
                7615,
                7596,
                7513,
                7514,
                7597,
                7605,
                7607,
                7608,
                7595
            ],
            "87": [
                7514,
                7605,
                7644,
                7607,
                7608
            ]
        },
         "2": {
            "0": [
                7573,
                7605,
                7572,
                7569
            ]
         }
}
Object.keys(json).forEach(function(key){
  Object.keys(json[key]).forEach(function(subkey){
    json[key][subkey]=json[key][subkey].filter(function(item){
      return array.indexOf(item)==-1;
    });
  });
});
console.log(json);