2017-09-25 31 views
0

如何从一个动态生成的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

JSON是*文本符号*进行数据交换。 [(More here。)](http://stackoverflow.com/a/2904181/157247)如果你正在处理JavaScript源代码,而不是处理*字符串*,那么你并没有处理JSON。 –

+0

你在哪里卡住?你的研究成果是什么?在这里对SO进行彻底的[搜索](/帮助/搜索)应该提供你需要做的事情。 –

+0

只是为了让事情更清楚,对象内的任何数字都可以是其他数字的数组吗?我的意思是,例如,'obj ['2'] ['0']'中的值7568是否可以是其他数字的数组?那就是'obj ['2'] ['0'] ['7568']'是一个数字数组。你的结构是动态的还是静态的 – Ammar

回答

1

您可以使用filter方法,接受组合回调函数Object.keys方法。

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

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

filter方法创建一个新阵列与通过由执行的测试的所有元件提供功能。

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

+0

谢谢@Alex。我不想盲目地复制和粘贴一个小的解释会很好。非常感谢。这行'json [key] [subkey] = json [key] [subkey] .filter(function(item){'是行头过去 – INFOSYS

+0

'filter'方法只创建一个新的数组..所以你需要更新 –

+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

Thanks @Patrick – INFOSYS

+0

@INFOSYS没问题,如果你想澄清任何事情,只需在这里留下你的具体问题的评论,我会更新我的答案,以解决它们。 –

+0

我唯一的问题是我使用'节点0.10 .24'为生产和猜测两个object.keys和分配可能无法正常工作我需要使用下划线为我猜 – INFOSYS