Reputation: 85
I have a list of object that has date and values. I would like to create a new object that sums the total of values in the object. I have a solution so far but not satisfied my code and wondering if you have any better solution?
Also, I would like to display the most recent year in order.
const dividendsYears = {
1976: [
0: {date: "1976-05-10", value: "0.00062"}
1: {date: "1976-07-16", value: "0.00062"}
2: {date: "1976-10-21", value: "0.00062"}
],
1977: [
0: {date: "1977-02-14", value: "0.00062"}
1: {date: "1977-05-12", value: "0.00123"}
2: {date: "1977-07-19", value: "0.00123"}
3: {date: "1977-10-18", value: "0.00123"}
],
1978: [
0: {date: "1978-02-14", value: "0.00123"}
1: {date: "1978-05-16", value: "0.00222"}
2: {date: "1978-07-19", value: "0.00222"}
3: {date: "1978-10-26", value: "0.00222"}
]
}
// Create new object that sum the total of value
let totalDividendsPerYear = {}
Object.entries(dividendsYears).forEach((entry, index) => {
let sum = 0
// Adds up dividends value per year
entry[1].forEach((item) => (
sum += Number(item.value)
))
totalDividendsPerYear[entry[0]] = sum
});
// Reverse array to sort the recent date to the oldest date
const sortRecentDate = Object.assign([], totalDividendsPerYear).reverse();
Expected result:
{
1978: 0.00789,
1977: 0.0043100000000000005,
1976: 0.00186
}
Upvotes: 0
Views: 75
Reputation: 22320
I think I get the shorter one : ;)
const dividendsYears = {
1976: [ { date: "1976-05-10", value: "0.00062" }
, { date: "1976-07-16", value: "0.00062" }
, { date: "1976-10-21", value: "0.00062" }
],
1977: [ { date: "1977-02-14", value: "0.00062" }
, { date: "1977-05-12", value: "0.00123" }
, { date: "1977-07-19", value: "0.00123" }
, { date: "1977-10-18", value: "0.00123" }
],
1978: [ { date: "1978-02-14", value: "0.00123" }
, { date: "1978-05-16", value: "0.00222" }
, { date: "1978-07-19", value: "0.00222" }
, { date: "1978-10-26", value: "0.00222" }
]
};
const result = Object.entries(dividendsYears).reduce((r,x)=>{r[x[0]]=x[1].reduce((a,c)=>a+parseFloat(c.value),0); return r},{});
console.log( result )
Upvotes: 1
Reputation: 18515
You can do this with a single Object.keys and Array.reduce:
const data = { 1976: [ {date: "1976-05-10", value: "0.00062"}, {date: "1976-07-16", value: "0.00062"}, {date: "1976-10-21", value: "0.00062"} ], 1977: [ {date: "1977-02-14", value: "0.00062"}, {date: "1977-05-12", value: "0.00123"}, {date: "1977-07-19", value: "0.00123"}, {date: "1977-10-18", value: "0.00123"} ], 1978: [ {date: "1978-02-14", value: "0.00123"}, {date: "1978-05-16", value: "0.00222"}, {date: "1978-07-19", value: "0.00222"}, {date: "1978-10-26", value: "0.00222"} ] }
let result = Object.keys(data).reduce((r,k) => {
r[k] = data[k].reduce((acc,c) => (+acc.value || acc || 0) + (+c.value))
return r
}, {})
console.log(result)
You can also one line it with some sacrifice to the readability:
const data = { 1976: [ {date: "1976-05-10", value: "0.00062"}, {date: "1976-07-16", value: "0.00062"}, {date: "1976-10-21", value: "0.00062"} ], 1977: [ {date: "1977-02-14", value: "0.00062"}, {date: "1977-05-12", value: "0.00123"}, {date: "1977-07-19", value: "0.00123"}, {date: "1977-10-18", value: "0.00123"} ], 1978: [ {date: "1978-02-14", value: "0.00123"}, {date: "1978-05-16", value: "0.00222"}, {date: "1978-07-19", value: "0.00222"}, {date: "1978-10-26", value: "0.00222"} ] }
let result = Object.keys(data).reduce((r,k) =>
(r[k] = data[k].reduce((a,c) => (+a.value || a || 0) + (+c.value))) && r, {})
console.log(result)
Upvotes: 2
Reputation: 29836
Here's a one liner solution:
const dividendsYears = {
"1976": [
{date: "1976-05-10", value: "0.00062"},
{date: "1976-07-16", value: "0.00062"},
{date: "1976-10-21", value: "0.00062"}
],
"1977": [
{date: "1977-02-14", value: "0.00062"},
{date: "1977-05-12", value: "0.00123"},
{date: "1977-07-19", value: "0.00123"},
{date: "1977-10-18", value: "0.00123"}
],
"1978": [
{date: "1978-02-14", value: "0.00123"},
{date: "1978-05-16", value: "0.00222"},
{date: "1978-07-19", value: "0.00222"},
{date: "1978-10-26", value: "0.00222"}
]
}
const result = Object.entries(dividendsYears).reduce((a,b) => { a[b[0]] = b[1].map(i => parseFloat(i.value)).reduce((k,j) => k + j); return a; },{});
document.write(JSON.stringify(result));
Upvotes: 1