将嵌套对象中的值与公共属性组合在一起

时间:2017-10-17 21:18:57

标签: javascript object nested

#问题

您好。我有一个包含不同数量的对象(一组指标)的JSON响应,每个对象都包含一组固定的其他对象(几何),每个对象都包含属性(其中一个是'得分')。 p>

我试图收集这些'得分'属性,以便稍后通过几何体来完成诸如min / mean / max之类的东西。

#Sample

这是一个例子(请记住,可能有两个以上的指标):

let data = [   {
    {
      "indicator": "A",
      "geom": "1",
      "score": 1
    },
    {
      "indicator": "A",
      "geom": "2",
      "score": 2
    }   },   {
    {
      "indicator": "B",
      "geom": "1",
      "score": 3
    },
    {
      "indicator": "B",
      "geom": "2",
      "score": 4
    }   } ]

#预期结果

我正在寻找的结果将是这样的,连续的值来自不同的子对象:

let expectedResult =   {
      {
      "indicator": ["A", "B"],
      "geom": "1",
      "score": [1,3]
    },
    {
      "indicator": ["A", "B],
      "geom": "2",
      "score": [2,4]
    }   }

#我的(不好)解决方案

我目前的,丑陋的错误解决方案是创建一个包含所有geom ID的数组:

let id = data[0].map(obj => obj.geom);

然后获取所有键值的完整列表:

let keyval;
data.map((indic) => { indic.map((geom) => 
    { keyval.push([car.geom, car.score])})});

最后将geom id var与具有相同id的值(以及切掉冗余id的值)结合起来:

    id.map((geom, idx) => {keyval.map((arr) => {
            if (car === arr[0]) { id.push(geom, arr.splice(0,1)})
            }
        })
    });

有谁知道更优雅/更高效......更重要的是工作解决方案?在我的研究期间看到了很多Array.prototype.reduce(),但没有弄清楚如何在这样的嵌套配置中使用它。

谢谢, O操作。

1 个答案:

答案 0 :(得分:0)

使用Array#reduce将值收集到Map,然后使用Map#values,并使用spread syntax转换回数组:

const data = [[{"indicator":"A","geom":"1","score":1},{"indicator":"A","geom":"2","score":2}],[{"indicator":"B","geom":"1","score":3},{"indicator":"B","geom":"2","score":4}]];

const result = [...[].concat(...data).reduce((map, o) => {
  const item = map.get(o.geom) || { geom: o.geom, indicator: [], score: [] }; // get the item from the map, or create a new one
  
  item.indicator.push(o.indicator);
  item.score.push(o.score);
  
  return map.set(o.geom, item); // set the item and return the map reference
}, new Map).values()]; // get the map values iterator, and use spread (...) to get an array

console.log(result);