我目前正在尝试映射和缩小函数以展平多维数组 这是一个模拟示例数据集:
data: [
{
label: "Sort-01"
data: [
{
label: "OCT-2017"
weight: 2304
},
{
label: "NOV-2017"
weight: 1783
}
]
},
{
label: "Sort-02"
data: [
{
label: "OCT-2017"
weight: 4785
},
{
label: "NOV-2017"
weight: 102
}
]
},
......
]
我知道为了按照排序编号进行map-reduce我可以使用:
data.map(sort => sort.data.reduce((a,b) => a.weight + b.weight));
但是,我希望按月减少排序编号 我将不胜感激任何帮助。
谢谢,
杰
答案 0 :(得分:2)
使用Array#map获取data
属性数组的数组,然后使用Array#concat和spread展平。使用Array#reduce将值收集到Map,然后使用Map#values和扩展语法转换回数组:
const array = [{"label":"Sort-01","data":[{"label":"OCT-2017","weight":2304},{"label":"NOV-2017","weight":1783}]},{"label":"Sort-02","data":[{"label":"OCT-2017","weight":4785},{"label":"NOV-2017","weight":102}]}];
const result = [... // spread the values iterator to an array
[].concat(...array.map(({ data }) => data)) // map the array into an array of data arrays
.reduce((m, { label, weight }) => {
// take item if label exists in map, if not create new
const item = m.get(label) || { label, weight: 0 };
item.weight += weight; // add the weight
return m.set(label, item); // set the item in the map
}, new Map).values()] // get the values iterator
console.log(result);

这是一个无散布的版本:
const array = [{"label":"Sort-01","data":[{"label":"OCT-2017","weight":2304},{"label":"NOV-2017","weight":1783}]},{"label":"Sort-02","data":[{"label":"OCT-2017","weight":4785},{"label":"NOV-2017","weight":102}]}];
const helper = Object.create(null);
const result = [].concat.apply([], array.map(({ data }) => data)) // map the array into an array of data arrays, and flatten by apply concat
.reduce((r, { label, weight }) => {
// if label is not in helper, add to helper, and push to r
if(!helper[label]) {
helper[label] = { label, weight: 0 };
r.push(helper[label]);
}
helper[label].weight += weight; // add the weight to the object
return r;
}, []) // get the values iterator
console.log(result);

答案 1 :(得分:1)
您可以使用reduce或concat (see Ori's answer)来获取展平的数据数组。从那里重新分配您的年份标签作为关键和重量作为价值。 然后传递给另一个减速器,以便按月计算你的重量。
SELECT min(id) as id,manager,company,city
FROM DistinctResult
group by company,city;