I have an array of objects. In each object, I have the ‘date’ key. if the ‘date’ value is matched with another object, I need to add the ‘amount’ property and make it a new object.
var obj = [
{
'date':'2017-02-08T00:00:00.000Z',
'amount': 20000
},{
'date':'2017-02-11T00:00:00.000Z',
'amount': 65989
},{
'date':'2017-02-08T00:00:00.000Z',
'amount': 256
},{
'date':'2017-02-08T00:00:00.000Z',
'amount': 269
},{
'date':'2017-02-11T00:00:00.000Z',
'amount': 900
},{
'date':'2017-02-11T00:00:00.000Z',
'amount': 6982.99
},{
'date':'2017-02-18T00:00:00.000Z',
'amount': 15248.09
},
];
Object.keys(obj).map(data1 =>{
Object.keys(obj).map(data2 =>{
if(obj[data]['date'] == obj[data2]['date']){
// i dont know what to do here.
}
});
})My expected output should be:
[
{
'date':'2017-02-08T00:00:00.000Z',
'amount': 20525
},{
'date':'2017-02-11T00:00:00.000Z',
'amount': 73,871.99
},{
'date':'2017-02-18T00:00:00.000Z',
'amount': 15248.09
},
]
Kindly help me to solve it.
Advertisement
Answer
You can use Array.reduce to calculate a sum per date value. Something like:
var obj = [
{
'date':'2017-02-08T00:00:00.000Z',
'amount': 20000
},{
'date':'2017-02-11T00:00:00.000Z',
'amount': 65989
},{
'date':'2017-02-08T00:00:00.000Z',
'amount': 256
},{
'date':'2017-02-08T00:00:00.000Z',
'amount': 269
},{
'date':'2017-02-11T00:00:00.000Z',
'amount': 900
},{
'date':'2017-02-11T00:00:00.000Z',
'amount': 6982.99
},{
'date':'2017-02-18T00:00:00.000Z',
'amount': 15248.09
},
];
// reduce to object with date keys, amount values
const totals = obj.reduce( (acc, val) => (
{ ...acc, [val.date]: (acc[val.date] || 0) + val.amount } ), {} );
// map back to array
const totalsMapped = Object.entries(totals).map( ([key, value]) => (
{date: key, amount: value} ) );
Logger()(
`Reduced:`,
JSON.stringify(totals, null, 2),
`Mapped:`,
JSON.stringify(totalsMapped, null, 2)
);
function Logger() {
const pre = document.querySelector('pre')
return (...lines) => lines.forEach(line => pre.textContent += `${line}n`)
}<pre></pre>