Javascript 对象数组对项目键的值求和,然后连续对值求和
Javascript array of objects sum values for items key then sum values consecutively
我有以下对象数组:
const dataSet = [
{
createdOn: '2020-06-01',
id: 1,
value: 12
},
{
createdOn: '2020-06-01',
id: 2,
value: 23
},
{
createdOn: '2020-06-02',
id: 3,
value: 40
},
{
createdOn: '2020-06-03',
id: 4,
value: 15
}
]
我希望能够 return 如下:
[
{
createdOn: '2020-06-01',
value: 35 // sum of 12 + 23
},
{
createdOn: '2020-06-02',
value: 75 // sum of 35 + 40
},
{
createdOn: '2020-06-03',
value: 90 // sum of 75 + 15
}
]
所以我想要的结果是:
- 当有两个(或更多)对象具有相同的
createdOn
日期时,
那么他们的 value
s 应该被添加到那个 createdOn
键的单个对象中。
- 每个对象的
value
然后还需要加在一起,创建一个累积的
value
来自上一个对象。
经过一些搜索,我发现 some code 这有助于我实现第一点:
dataSet.reduce((acc, cur) => {
const date = cur.createdOn
const found = acc.find(elem => elem.createdOn === date)
if (found) {
found.value += cur.value
} else {
acc.push(cur)
}
return acc
}, [])
我只是想不通如何实现累计值部分。
在此先致谢,祝周末愉快。
我会这样做。首先计算每个不同 createdOn
值的累积值,然后将结果映射转换回数组:
const map = dataSet.reduce((acc, {createdOn, value}) => {
acc[createdOn] = value + (acc[createdOn] || 0);
return acc;
}, {});
const result = Object.entries(map).map(([key, value], index) => ({
createdOn: key,
value: value
}));
result.forEach((item, index) => {
if (index) {
item.value += result[index - 1].value;
}
});
这个怎么样:
var dataSet = [ { createdOn: '2020-06-01', id: 1, value: 12 }, { createdOn: '2020-06-01', id: 2, value: 23 }, { createdOn: '2020-06-02', id: 3, value: 40 }, { createdOn: '2020-06-03', id: 4, value: 15 }];
var finalResult = Object.values(dataSet.reduce((acc, {createdOn, value})=>{
acc[createdOn] = acc[createdOn] || {createdOn, value:0};
acc[createdOn].value+=value;
return acc;
},{})).map((e,i,self)=>(e.value+=self[i-1] ? self[i-1].value : 0, e));
console.log(finalResult);
我有以下对象数组:
const dataSet = [
{
createdOn: '2020-06-01',
id: 1,
value: 12
},
{
createdOn: '2020-06-01',
id: 2,
value: 23
},
{
createdOn: '2020-06-02',
id: 3,
value: 40
},
{
createdOn: '2020-06-03',
id: 4,
value: 15
}
]
我希望能够 return 如下:
[
{
createdOn: '2020-06-01',
value: 35 // sum of 12 + 23
},
{
createdOn: '2020-06-02',
value: 75 // sum of 35 + 40
},
{
createdOn: '2020-06-03',
value: 90 // sum of 75 + 15
}
]
所以我想要的结果是:
- 当有两个(或更多)对象具有相同的
createdOn
日期时, 那么他们的value
s 应该被添加到那个createdOn
键的单个对象中。 - 每个对象的
value
然后还需要加在一起,创建一个累积的value
来自上一个对象。
经过一些搜索,我发现 some code 这有助于我实现第一点:
dataSet.reduce((acc, cur) => {
const date = cur.createdOn
const found = acc.find(elem => elem.createdOn === date)
if (found) {
found.value += cur.value
} else {
acc.push(cur)
}
return acc
}, [])
我只是想不通如何实现累计值部分。
在此先致谢,祝周末愉快。
我会这样做。首先计算每个不同 createdOn
值的累积值,然后将结果映射转换回数组:
const map = dataSet.reduce((acc, {createdOn, value}) => {
acc[createdOn] = value + (acc[createdOn] || 0);
return acc;
}, {});
const result = Object.entries(map).map(([key, value], index) => ({
createdOn: key,
value: value
}));
result.forEach((item, index) => {
if (index) {
item.value += result[index - 1].value;
}
});
这个怎么样:
var dataSet = [ { createdOn: '2020-06-01', id: 1, value: 12 }, { createdOn: '2020-06-01', id: 2, value: 23 }, { createdOn: '2020-06-02', id: 3, value: 40 }, { createdOn: '2020-06-03', id: 4, value: 15 }];
var finalResult = Object.values(dataSet.reduce((acc, {createdOn, value})=>{
acc[createdOn] = acc[createdOn] || {createdOn, value:0};
acc[createdOn].value+=value;
return acc;
},{})).map((e,i,self)=>(e.value+=self[i-1] ? self[i-1].value : 0, e));
console.log(finalResult);