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.
JavaScript
x
32
32
1
var obj = [
2
{
3
'date':'2017-02-08T00:00:00.000Z',
4
'amount': 20000
5
},{
6
'date':'2017-02-11T00:00:00.000Z',
7
'amount': 65989
8
},{
9
'date':'2017-02-08T00:00:00.000Z',
10
'amount': 256
11
},{
12
'date':'2017-02-08T00:00:00.000Z',
13
'amount': 269
14
},{
15
'date':'2017-02-11T00:00:00.000Z',
16
'amount': 900
17
},{
18
'date':'2017-02-11T00:00:00.000Z',
19
'amount': 6982.99
20
},{
21
'date':'2017-02-18T00:00:00.000Z',
22
'amount': 15248.09
23
},
24
];
25
26
Object.keys(obj).map(data1 =>{
27
Object.keys(obj).map(data2 =>{
28
if(obj[data]['date'] == obj[data2]['date']){
29
// i dont know what to do here.
30
}
31
});
32
})
My expected output should be:
JavaScript
1
14
14
1
[
2
{
3
'date':'2017-02-08T00:00:00.000Z',
4
'amount': 20525
5
},{
6
'date':'2017-02-11T00:00:00.000Z',
7
'amount': 73,871.99
8
},{
9
'date':'2017-02-18T00:00:00.000Z',
10
'amount': 15248.09
11
},
12
]
13
14
Kindly help me to solve it.
Advertisement
Answer
You can use Array.reduce
to calculate a sum per date value. Something like:
JavaScript
1
44
44
1
var obj = [
2
{
3
'date':'2017-02-08T00:00:00.000Z',
4
'amount': 20000
5
},{
6
'date':'2017-02-11T00:00:00.000Z',
7
'amount': 65989
8
},{
9
'date':'2017-02-08T00:00:00.000Z',
10
'amount': 256
11
},{
12
'date':'2017-02-08T00:00:00.000Z',
13
'amount': 269
14
},{
15
'date':'2017-02-11T00:00:00.000Z',
16
'amount': 900
17
},{
18
'date':'2017-02-11T00:00:00.000Z',
19
'amount': 6982.99
20
},{
21
'date':'2017-02-18T00:00:00.000Z',
22
'amount': 15248.09
23
},
24
];
25
26
// reduce to object with date keys, amount values
27
const totals = obj.reduce( (acc, val) => (
28
{ acc, [val.date]: (acc[val.date] || 0) + val.amount } ), {} );
29
30
// map back to array
31
const totalsMapped = Object.entries(totals).map( ([key, value]) => (
32
{date: key, amount: value} ) );
33
34
Logger()(
35
`Reduced:`,
36
JSON.stringify(totals, null, 2),
37
`Mapped:`,
38
JSON.stringify(totalsMapped, null, 2)
39
);
40
41
function Logger() {
42
const pre = document.querySelector('pre')
43
return (lines) => lines.forEach(line => pre.textContent += `${line}n`)
44
}
JavaScript
1
1
1
<pre></pre>