接收条件推送数组的重复结果
receiving repetitive result for conditional push array
我正在尝试根据它们的公共对象键将我的对象数组转换为新的对象数组,并对每个对象的所有其他属性求和。但我不知道为什么我一直收到一个项目编号正确但项目重复的数组(最后一个新对象)。这是代码:
function(){
const list = [
{
amount: 0,
date: '2018-11-29',
source: 'a'
}
{
amount: 2,
date: '2018-11-29',
source: 'b'
}
{
amount: 3,
date: '2018-11-30',
source: 'b'
}
]
const daysGroup = []
let dayGroup = {
date: list[0].date,
a: '',
b: ''
}
for (let i = 0; i < list.length; i++) {
if(dayGroup.date === list[i].date){
switch (list[i].source) {
case 'a':
dayGroup.a += Number(list[i].amount)
break;
case 'b':
dayGroup.b += Number(list[i].amount)
break;
default:
break;
}
console.log(dayGroup)
} else{
console.log(dayGroup)
daysGroup.unshift(dayGroup)
dayGroup.date = list[i].date
switch (list[i].source) {
case 'a':
dayGroup.a += Number(list[i].amount)
break;
case 'b':
dayGroup.b += Number(list[i].amount)
break;
default:
break;
}
}
}
console.log(daysGroup)
return daysGroup
}
这是我得到的结果:
[
{
date: '2018-11-30',
a: 0,
b: 3
},
{
date: '2018-11-30',
a: 0,
b: 3
},
{
date: '2018-11-30',
a: 0,
b: 3
}
]
在堆栈中进行搜索时,我意识到有些人通过将新的虚拟对象放入 for 循环中解决了这个问题。但这弄乱了我正在寻找的结果。
我的目标是得到这样的结果:
[
{
date: '2018-11-29',
a: 0,
b: 2
},
{
date: '2018-11-30',
a: 0,
b: 3
}
]
您可以使用 Array.reduce
以更简洁的方式解决此问题:
const list = [{ amount: 0, date: '2018-11-29', source: 'a' }, { amount: 2, date: '2018-11-29', source: 'b' }, { amount: 3, date: '2018-11-30', source: 'b' } ]
const result = list.reduce((r, {date, amount, source}) => {
r[date] = r[date] || {date, a: 0, b: 0}
r[date][source] += amount
return r
}, {})
console.log(Object.values(result))
我们的想法是 group
通过 date
并且在这样做的同时不断总结 source
金额。
我正在尝试根据它们的公共对象键将我的对象数组转换为新的对象数组,并对每个对象的所有其他属性求和。但我不知道为什么我一直收到一个项目编号正确但项目重复的数组(最后一个新对象)。这是代码:
function(){
const list = [
{
amount: 0,
date: '2018-11-29',
source: 'a'
}
{
amount: 2,
date: '2018-11-29',
source: 'b'
}
{
amount: 3,
date: '2018-11-30',
source: 'b'
}
]
const daysGroup = []
let dayGroup = {
date: list[0].date,
a: '',
b: ''
}
for (let i = 0; i < list.length; i++) {
if(dayGroup.date === list[i].date){
switch (list[i].source) {
case 'a':
dayGroup.a += Number(list[i].amount)
break;
case 'b':
dayGroup.b += Number(list[i].amount)
break;
default:
break;
}
console.log(dayGroup)
} else{
console.log(dayGroup)
daysGroup.unshift(dayGroup)
dayGroup.date = list[i].date
switch (list[i].source) {
case 'a':
dayGroup.a += Number(list[i].amount)
break;
case 'b':
dayGroup.b += Number(list[i].amount)
break;
default:
break;
}
}
}
console.log(daysGroup)
return daysGroup
}
这是我得到的结果:
[
{
date: '2018-11-30',
a: 0,
b: 3
},
{
date: '2018-11-30',
a: 0,
b: 3
},
{
date: '2018-11-30',
a: 0,
b: 3
}
]
在堆栈中进行搜索时,我意识到有些人通过将新的虚拟对象放入 for 循环中解决了这个问题。但这弄乱了我正在寻找的结果。
我的目标是得到这样的结果:
[
{
date: '2018-11-29',
a: 0,
b: 2
},
{
date: '2018-11-30',
a: 0,
b: 3
}
]
您可以使用 Array.reduce
以更简洁的方式解决此问题:
const list = [{ amount: 0, date: '2018-11-29', source: 'a' }, { amount: 2, date: '2018-11-29', source: 'b' }, { amount: 3, date: '2018-11-30', source: 'b' } ]
const result = list.reduce((r, {date, amount, source}) => {
r[date] = r[date] || {date, a: 0, b: 0}
r[date][source] += amount
return r
}, {})
console.log(Object.values(result))
我们的想法是 group
通过 date
并且在这样做的同时不断总结 source
金额。