繁体   English   中英

根据与数组中的值匹配的键过滤嵌套对象

[英]Filtering a nested Object based on keys which match values in an array

我在保留原始Object结构的同时,难以根据另一个数组过滤嵌套Object的键。

输入:

data = [
          {0: { key: "A", values: { 0: {g1: 0, g2: 0, g3: 0, g4: 0}}}},
          {1: { key: "B", values: { 0: {g2: 0, g3: 0, g5: 0}}}}
       ]

arr = [g1, g2, g3]

预期产量:

data = [
          {0: { key: "A", values: { 0: {g1: 0, g2: 0, g3: 0}}}},
          {1: { key: "B", values: { 0: {g2: 0, g3: 0}}}}
       ]

到目前为止,我所做的是:

data.forEach(function(e,i) {
    r = Object.keys(e[i].values[0]).filter(d => arr.includes(d))
    console.log(r)
})

这样可以正确打印[g1,g2,g3]和[g2,g3],但是我想保留原始的Object结构,而不仅仅是公共键的列表。

这段代码可以满足您的需求。 将数组r为一个对象,并将其分配给原始对象。

 var data = [ {0: { key: "A", values: { 0: {g1: 0, g2: 0, g3: 0, g4: 0}}}}, {1: { key: "B", values: { 0: {g2: 0, g3: 0, g5: 0}}}} ] var arr = ["g1", "g2", "g3"] var output = data.map(function(e,i) { var r = Object.keys(e[i].values[0]).filter(d => arr.includes(d)); var values = r.reduce((obj,key)=>{obj[key] = 0 ; return obj;},{}); var obj = {}; obj[i] = Object.assign(e[i],{values:{0:values}}) console.log(obj); return obj; }) console.log(output); 

实际上,这并不比从头开始重建输出对象好多少。

 var data = [ {0: { key: "A", values: { 0: {g1: 0, g2: 0, g3: 0, g4: 0}}}}, {1: { key: "B", values: { 0: {g2: 0, g3: 0, g5: 0}}}} ] var arr = ["g1", "g2", "g3"] var output = data.map(function(e,i) { var obj = {}; obj[i] = {key : e[i].key, values : {0:{}}}; arr.forEach((ele)=>{ if(e[i].values[0][ele] != undefined) { obj[i].values[0][ele] = e[i].values[0][ele]; } }); console.log(obj); return obj; }) console.log(output); 

假设您的data对象符合格式要求(说明已包含在代码注释中),则可能会用这种方法解决问题。

 function pruneObject(object, desiredKeys) { Object.keys(object) .filter(key => !desiredKeys.includes(key)) //Ignore desired keys .forEach(key => delete object[key]) //Remove the leftovers } var data = [{ 0: { key: "A", values: { 0: { g1: 0, g2: 0, g3: 0, g4: 0 } } } }, { 1: { key: "B", values: { 0: { g2: 0, g3: 0, g5: 0 } } } } ]; var arr = ['g1', 'g2', 'g3']; data.forEach((item,index) => pruneObject(item[index].values[0], arr)); //Prune each "values" object console.log(data); 

注意:这将修改原始对象,尽管如有必要,我可以编写一个替代解决方案来保留它并返回一个新对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM