您好。我有一个包含不同数量的对象(一组指标)的JSON响应,每个对象都包含一组固定的其他对象(几何),每个对象都包含属性(其中一个是'得分')。 p>
我试图收集这些'得分'属性,以便稍后通过几何体来完成诸如min / mean / max之类的东西。
这是一个例子(请记住,可能有两个以上的指标):
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操作。
答案 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);