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

时间:2018-11-05 04:20:51

标签: javascript ecmascript-6

在保留原始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结构,而不仅仅是列出公用键。

2 个答案:

答案 0 :(得分:0)

此代码可满足您的需求。将数组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);

答案 1 :(得分:0)

假设您的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);

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