任何想法如何重组像这样的数据结构
var data = [
[{
jan: 10,
feb: 20,
mar: 30,
type: "one"
},
{
jan: 20,
feb: 10,
mar: 40,
type: "one"
}],
[
{
jan: 10,
feb: 20,
mar: 30,
type: "two"
},
{
jan: 20,
feb: 10,
mar: 40,
type: "two"
}]
]
console.log(data)
这样的事情?
var data = [
{
jan: 30,
feb: 30,
mar: 70,
type: "one"
},
{
jan: 30,
feb: 30,
mar: 70,
type: "two"
}
]
console.log(data)
如示例中所示,合并了同一数组中的对象,并添加了jan
,feb
和mar
键。
我的智慧结束了。 在此先感谢:)
答案 0 :(得分:2)
您可以在javascript数组上使用map
和reduce
函数来实现结果。
使用map
迭代主数组中的子数组,并在这些子数组中使用reduce
来总结月数据。
var data = [
[{
jan: 10,
feb: 20,
mar: 30,
type: "one"
},
{
jan: 20,
feb: 10,
mar: 40,
type: "one"
}],
[
{
jan: 10,
feb: 20,
mar: 30,
type: "two"
},
{
jan: 20,
feb: 10,
mar: 40,
type: "two"
}]
]
var newData = data.map(function(arr){
return arr.reduce(function(acc, ele, i){
if(i === 0){
acc = ele;
}
else{
var keys= Object.keys(ele);
keys.splice(keys.indexOf("type"), 1);
keys.forEach(function(key){
acc[key] += ele[key];
})
}
return acc;
},{});
});
console.log(newData)
答案 1 :(得分:0)
您可以为具有相同type
的对象获取哈希表,并添加非type
的所有属性值。
var data = [[{ jan: 10, feb: 20, mar: 30, type: "one" }, { jan: 20, feb: 10, mar: 40, type: "one" }], [{ jan: 10, feb: 20, mar: 30, type: "two" }, { jan: 20, feb: 10, mar: 40, type: "two" }]],
hash = Object.create(null),
grouped = [];
data.forEach(function (a) {
a.forEach(function (o) {
if (!hash[o.type]) {
hash[o.type] = { type: o.type };
grouped.push(hash[o.type]);
}
Object.keys(o).forEach(function (k) {
if (k === 'type') {
return;
}
hash[o.type][k] = (hash[o.type][k] || 0) + o[k];
});
});
});
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 2 :(得分:0)
使用reduce
和forEach
var output = Object.values( data.reduce( function( a, c ){
c.forEach( function( item ){
a[ item.type ] = a[ item.type ] || { jan: 0, feb: 0, mar: 0, type: item.type };
a[ item.type ].jan += item.jan;
a[ item.type ].feb += item.feb;
a[ item.type ].mar += item.mar;
});
return a;
}, {}));
<强>演示强>
var data = [
[{
jan: 10,
feb: 20,
mar: 30,
type: "one"
},
{
jan: 20,
feb: 10,
mar: 40,
type: "one"
}],
[
{
jan: 10,
feb: 20,
mar: 30,
type: "two"
},
{
jan: 20,
feb: 10,
mar: 40,
type: "two"
}]
];
var output = Object.values( data.reduce( function( a, c ){
c.forEach( function( item ){
a[ item.type ] = a[ item.type ] || { jan: 0, feb: 0, mar: 0, type: item.type };
a[ item.type ].jan += item.jan;
a[ item.type ].feb += item.feb;
a[ item.type ].mar += item.mar;
});
return a;
}, {}));
console.log(output);
答案 3 :(得分:0)
您可以使用array#reduce
根据type
值对数据进行分组。使用array#forEach
遍历每个数组。
var data = [ [{ jan: 10, feb: 20, mar: 30, type: "one" }, { jan: 20, feb: 10, mar: 40, type: "one" }], [ { jan: 10, feb: 20, mar: 30, type: "two" }, { jan: 20, feb: 10, mar: 40, type: "two" }] ];
var result = Object.values(data.reduce((r,a) => {
a.forEach(o => {
r[o.type] = r[o.type] || Object.assign({'type': o.type});
Object.keys(o).forEach(k => {
if(k !== 'type')
r[o.type][k] = (r[o.type][k] || 0) + o[k];
});
});
return r;
},{}));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 4 :(得分:0)
data.reduce((a,c) => {
return a.concat(c.reduce((a2,c2) => {
if(Object.keys(a2).length === 0) return c2;
return Object.assign({}, a2, {jan: a2.jan + c2.jan, feb: a2.feb + c2.feb, mar: a2.mar + c2.mar})
},{}))
},[])
嵌套减少完全不可变的解决方案。