Как пройти объект, который имеет массив и суммировать значения? - PullRequest
0 голосов
/ 18 мая 2019

У меня есть список объекта, который имеет дату и значения. Я хотел бы создать новый объект, который суммирует сумму значений в объекте. У меня пока есть решение, но я не удовлетворен моим кодом, и мне интересно, есть ли у вас лучшее решение?

Кроме того, я хотел бы отобразить самый последний год по порядку.

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();

Ожидаемый результат:

{
    1978: 0.00789,
    1977: 0.0043100000000000005,
    1976: 0.00186
}

Ответы [ 3 ]

2 голосов
/ 19 мая 2019

Вы можете сделать это с помощью одного Object.keys и 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)

Вы также можете поставить одну строчку с некоторой жертвой читабельности:

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)
1 голос
/ 19 мая 2019

Я думаю, что получаю более короткий:;)

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 )
1 голос
/ 19 мая 2019

Вот решение с одним вкладышем:

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...