数据整理:将 javascript 中两个不同数组的值相加并推送一个新对象
Data wrangling: Sum values from two different arrays in javascript and push a new object
我有两个 arrays/json 文件,格式如下:
const data2 = [{date: "2018-04-23", a: 2, b: 2},
{date: "2020-04-24", a: 1, b: 2},
{date: "2020-04-25", a: 1, b: 2}]
const data3 = [{date: "2018-04-23", a: 5, b: 2},
{date: "2020-04-24", a: 4, b: 2},
{date: "2020-04-25", a: 1, b: 2}]
我想得到以下结果:
const result = [{date: "2018-04-23", sum: 7},
{date: "2020-04-24", sum: 5},
{date: "2020-04-25", sum: 2}]
calculate/create 这个新数组的最佳方法是什么?
我试过这个:
let result = [];
for( var i=1; i < data3.length; i++) {
result.push({ date: data3[i].date,
sum: data2[i].a + data3[i].a})
}
问题是我需要确保 data2
和 data3
数组都按 date
排序。有没有更好的方法来考虑 for 循环中的 date
?与 for 循环不同的任何其他结构都可以。我想知道通过 date
.
获取 result
数组检查的最佳方法是什么
const result = data2.map(item => {
const fItem = data3.find(e=>e.date === item.date)
if(fItem){
return {date: item.date, sum: item.a + fItem.a}
}
return {date: item.date, sum: item.a}
})
希望这段代码对你有用
我有另一个解决方案是将 data3 转换为一个对象,键是日期,值是一个属性。例如:
const object = data3.reduce((init, item)=> ({...init, [item.date]: item.a}), {})
之后使用同上
const fItem = data3.find(e=>e.date === item.date)
改为
const fItem = obj[item.date]
您可以创建地图,然后对值求和
const data2 = [{
date: "2018-04-23",
a: 2,
b: 2
},
{
date: "2020-04-24",
a: 1,
b: 2
},
{
date: "2020-04-25",
a: 1,
b: 2
}
]
const data3 = [{
date: "2018-04-23",
a: 5,
b: 2
},
{
date: "2020-04-24",
a: 4,
b: 2
},
{
date: "2020-04-25",
a: 1,
b: 2
}
]
const map2 = data2.reduce((acc, cur) => {
acc[cur.date] = cur.a;
return acc;
}, {});
const map3 = data3.reduce((acc, cur) => {
acc[cur.date] = (acc[cur.date] || 0) + cur.a;
return acc;
}, map2);
const result = Object.keys(map3).map(k => {
return {
date: k,
sum: map3[k]
};
});
console.log(result);
我有两个 arrays/json 文件,格式如下:
const data2 = [{date: "2018-04-23", a: 2, b: 2},
{date: "2020-04-24", a: 1, b: 2},
{date: "2020-04-25", a: 1, b: 2}]
const data3 = [{date: "2018-04-23", a: 5, b: 2},
{date: "2020-04-24", a: 4, b: 2},
{date: "2020-04-25", a: 1, b: 2}]
我想得到以下结果:
const result = [{date: "2018-04-23", sum: 7},
{date: "2020-04-24", sum: 5},
{date: "2020-04-25", sum: 2}]
calculate/create 这个新数组的最佳方法是什么?
我试过这个:
let result = [];
for( var i=1; i < data3.length; i++) {
result.push({ date: data3[i].date,
sum: data2[i].a + data3[i].a})
}
问题是我需要确保 data2
和 data3
数组都按 date
排序。有没有更好的方法来考虑 for 循环中的 date
?与 for 循环不同的任何其他结构都可以。我想知道通过 date
.
result
数组检查的最佳方法是什么
const result = data2.map(item => {
const fItem = data3.find(e=>e.date === item.date)
if(fItem){
return {date: item.date, sum: item.a + fItem.a}
}
return {date: item.date, sum: item.a}
})
希望这段代码对你有用
我有另一个解决方案是将 data3 转换为一个对象,键是日期,值是一个属性。例如:
const object = data3.reduce((init, item)=> ({...init, [item.date]: item.a}), {})
之后使用同上
const fItem = data3.find(e=>e.date === item.date)
改为
const fItem = obj[item.date]
您可以创建地图,然后对值求和
const data2 = [{
date: "2018-04-23",
a: 2,
b: 2
},
{
date: "2020-04-24",
a: 1,
b: 2
},
{
date: "2020-04-25",
a: 1,
b: 2
}
]
const data3 = [{
date: "2018-04-23",
a: 5,
b: 2
},
{
date: "2020-04-24",
a: 4,
b: 2
},
{
date: "2020-04-25",
a: 1,
b: 2
}
]
const map2 = data2.reduce((acc, cur) => {
acc[cur.date] = cur.a;
return acc;
}, {});
const map3 = data3.reduce((acc, cur) => {
acc[cur.date] = (acc[cur.date] || 0) + cur.a;
return acc;
}, map2);
const result = Object.keys(map3).map(k => {
return {
date: k,
sum: map3[k]
};
});
console.log(result);