无法弄清楚如何正确断言对象
Unable to figure out how to assert an object correctly
let records = {
2018: {
Jan: {
records: [{
id: 123,
date: '01-Jan-2018',
amount: 300,
type: 'expense'
}],
totalExpenses: 300,
totalIncome: 0
},
Feb: {
records: [{
id: 234,
date: '01-Jan-2019',
description: 'Syabas',
amount: 100,
type: 'income'
}],
totalExpenses: 0,
totalIncome: 100
}
},
2019: {
Jan: {
records: [{
id: 789,
date: '01-Jan-2019',
description: 'McD',
amount: 150,
type: 'expense'
}],
totalExpenses: 150,
totalIncome: 0
},
}
}
let year = 2018;
let month = 'Jan';
const yearRecords = records[year] || { [year]: {} };
const monthRecords = yearRecords[month] || { [month]: {} };
const recordList = monthRecords['records'] || [];
const newRec = {id: 666, amount: 9999};
const newRecordList = [...recordList, newRec];
monthRecords['records'] = newRecordList;
monthRecords.totalExpenses = newRecordList.reduce((accumulator, record) => {
return accumulator + record.amount;
}, 0);
console.log({...records, [year]: yearRecords})
我有一个现有 records
的列表,我正在尝试将新记录 newRec
添加到此 records
。
挑战在于,年份 might/might 的键不存在,几个月也是如此。如果存在,追加到 records
数组并增加 totalExpenses
字段。
如上所示,如果 year/month
存在于 records
中,我就可以正常工作,但如果我将其设置为 let year = 2020
,它就会在记录中多出一层,这是错误的。我已经尝试了很多小时仍然无法弄清楚,想知道是否有更简单的方法来进行上述断言?
当年份 = 2020 时,下面将显示错误结果
let records = {
2018: {
Jan: {
records: [{
id: 123,
date: '01-Jan-2018',
amount: 300,
type: 'expense'
}],
totalExpenses: 300,
totalIncome: 0
},
Feb: {
records: [{
id: 234,
date: '01-Jan-2019',
description: 'Syabas',
amount: 100,
type: 'income'
}],
totalExpenses: 0,
totalIncome: 100
}
},
2019: {
Jan: {
records: [{
id: 789,
date: '01-Jan-2019',
description: 'McD',
amount: 150,
type: 'expense'
}],
totalExpenses: 150,
totalIncome: 0
},
}
}
let year = 2020;
let month = 'Jan';
const yearRecords = records[year] || { [year]: {} };
const monthRecords = yearRecords[month] || { [month]: {} };
const recordList = monthRecords['records'] || [];
const newRec = {id: 666, amount: 9999};
const newRecordList = [...recordList, newRec];
monthRecords['records'] = newRecordList;
monthRecords.totalExpenses = newRecordList.reduce((accumulator, record) => {
return accumulator + record.amount;
}, 0);
console.log({...records, [year]: yearRecords})
您可以使用 reduce
方法执行此操作。
let records = {"2018":{"Jan":{"records":[{"id":123,"date":"01-Jan-2018","amount":300,"type":"expense"}],"totalExpenses":300,"totalIncome":0},"Feb":{"records":[{"id":234,"date":"01-Jan-2019","description":"Syabas","amount":100,"type":"income"}],"totalExpenses":0,"totalIncome":100}},"2019":{"Jan":{"records":[{"id":789,"date":"01-Jan-2019","description":"McD","amount":150,"type":"expense"}],"totalExpenses":150,"totalIncome":0}}}
let month = 'Jan';
function update(year, month, obj, target) {
[year, month].reduce(function(r, e, i, a) {
if(!a[i + 1] && r[e]) {
r[e].records.push(obj);
r[e].totalExpenses += obj.amount
}
return r[e] = (r[e] || (a[i + 1] ? {} : {
records: [obj],
totalExpenses: obj.amount,
totalIncome: 0
}))
}, target)
}
update(2018, month, {id: 4, amount: 9999}, records);
update(2020, month, {id: 5, amount: 9999}, records);
console.log(records)
let records = {
2018: {
Jan: {
records: [{
id: 123,
date: '01-Jan-2018',
amount: 300,
type: 'expense'
}],
totalExpenses: 300,
totalIncome: 0
},
Feb: {
records: [{
id: 234,
date: '01-Jan-2019',
description: 'Syabas',
amount: 100,
type: 'income'
}],
totalExpenses: 0,
totalIncome: 100
}
},
2019: {
Jan: {
records: [{
id: 789,
date: '01-Jan-2019',
description: 'McD',
amount: 150,
type: 'expense'
}],
totalExpenses: 150,
totalIncome: 0
},
}
}
let year = 2018;
let month = 'Jan';
const yearRecords = records[year] || { [year]: {} };
const monthRecords = yearRecords[month] || { [month]: {} };
const recordList = monthRecords['records'] || [];
const newRec = {id: 666, amount: 9999};
const newRecordList = [...recordList, newRec];
monthRecords['records'] = newRecordList;
monthRecords.totalExpenses = newRecordList.reduce((accumulator, record) => {
return accumulator + record.amount;
}, 0);
console.log({...records, [year]: yearRecords})
我有一个现有 records
的列表,我正在尝试将新记录 newRec
添加到此 records
。
挑战在于,年份 might/might 的键不存在,几个月也是如此。如果存在,追加到 records
数组并增加 totalExpenses
字段。
如上所示,如果 year/month
存在于 records
中,我就可以正常工作,但如果我将其设置为 let year = 2020
,它就会在记录中多出一层,这是错误的。我已经尝试了很多小时仍然无法弄清楚,想知道是否有更简单的方法来进行上述断言?
当年份 = 2020 时,下面将显示错误结果
let records = {
2018: {
Jan: {
records: [{
id: 123,
date: '01-Jan-2018',
amount: 300,
type: 'expense'
}],
totalExpenses: 300,
totalIncome: 0
},
Feb: {
records: [{
id: 234,
date: '01-Jan-2019',
description: 'Syabas',
amount: 100,
type: 'income'
}],
totalExpenses: 0,
totalIncome: 100
}
},
2019: {
Jan: {
records: [{
id: 789,
date: '01-Jan-2019',
description: 'McD',
amount: 150,
type: 'expense'
}],
totalExpenses: 150,
totalIncome: 0
},
}
}
let year = 2020;
let month = 'Jan';
const yearRecords = records[year] || { [year]: {} };
const monthRecords = yearRecords[month] || { [month]: {} };
const recordList = monthRecords['records'] || [];
const newRec = {id: 666, amount: 9999};
const newRecordList = [...recordList, newRec];
monthRecords['records'] = newRecordList;
monthRecords.totalExpenses = newRecordList.reduce((accumulator, record) => {
return accumulator + record.amount;
}, 0);
console.log({...records, [year]: yearRecords})
您可以使用 reduce
方法执行此操作。
let records = {"2018":{"Jan":{"records":[{"id":123,"date":"01-Jan-2018","amount":300,"type":"expense"}],"totalExpenses":300,"totalIncome":0},"Feb":{"records":[{"id":234,"date":"01-Jan-2019","description":"Syabas","amount":100,"type":"income"}],"totalExpenses":0,"totalIncome":100}},"2019":{"Jan":{"records":[{"id":789,"date":"01-Jan-2019","description":"McD","amount":150,"type":"expense"}],"totalExpenses":150,"totalIncome":0}}}
let month = 'Jan';
function update(year, month, obj, target) {
[year, month].reduce(function(r, e, i, a) {
if(!a[i + 1] && r[e]) {
r[e].records.push(obj);
r[e].totalExpenses += obj.amount
}
return r[e] = (r[e] || (a[i + 1] ? {} : {
records: [obj],
totalExpenses: obj.amount,
totalIncome: 0
}))
}, target)
}
update(2018, month, {id: 4, amount: 9999}, records);
update(2020, month, {id: 5, amount: 9999}, records);
console.log(records)