javascript - 如何遍历具有数组的对象并对值求和?

标签 javascript arrays object

我有一个包含日期和值的对象列表。我想创建一个新对象来对对象中的值求和。到目前为止我有一个解决方案,但不满足我的代码,想知道您是否有更好的解决方案?

此外,我想按顺序显示最近一年。

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
}

最佳答案

您可以使用单个 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)

关于javascript - 如何遍历具有数组的对象并对值求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56202770/

相关文章:

javascript - 保存 promise 的变化变量

javascript - 在 react js 中搜索一个好年选择器下拉包。我试过 react-year-picker 但图书馆有一些错误

C++ 快速排序字母数组

python - Python 中用于变量重复操作的快捷方式?

javascript - 提取多个字符串

javascript - 如何在ES6函数中触发onClick()函数?

php根据字符串对数组进行排序

arrays - 在 JMeter 中从 CSV 文件传递​​数组

arrays - 在 react 中映射对象键并返回子属性

java - 主要和对象,Java