【问题标题】:How to get the sum of specific values in an array contained within another array如何获取另一个数组中包含的数组中特定值的总和
【发布时间】:2021-05-22 13:26:12
【问题描述】:

我有一个包含另一个数组的数组的对象。我需要将这些名称相互匹配的子数组中的值相加。

let arr = {
    expenses: [
        {
            id: 11,
            freqs: [
                { name: "day", value: 100 },
                { name: "week", value: 200 },
                { name: "month", value: 300 },
            ],
        },
        {
            id: 12,
            freqs: [
                { name: "day", value: 100 },
                { name: "week", value: 200 },
                { name: "month", value: 300 },
            ],
        },
        {
            id: 13,
            freqs: [
                { name: "day", value: 100 },
                { name: "week", value: 200 },
                { name: "month", value: 300 },
            ],
        },
    ],
};

在这个例子中,我需要结果:

let result = [
    { name: "day", value: 300 },
    { name: "week", value: 600 },
    { name: "month", value: 900 },
];

多年来,我一直在尝试结合使用 filter()reduce() 方法(不确定这些方法是否正确),但我就是不明白 - 这对我来说真的是一个令人头疼的问题! 谢谢

【问题讨论】:

  • 笔和纸你会怎么做?

标签: javascript arrays


【解决方案1】:

这会将所有频率组合到一个数组中,然后将它们的值相加到一个对象中,然后将该对象重新格式化为具有名称和值键的对象数组。

const arr = {"expenses":[{"id":11,"freqs":[{"name":"day","value":100},{"name":"week","value":200},{"name":"month","value":300}]},{"id":12,"freqs":[{"name":"day","value":100},{"name":"week","value":200},{"name":"month","value":300}]},{"id":13,"freqs":[{"name":"day","value":100},{"name":"week","value":200},{"name":"month","value":300}]}]};

const res = Object.entries(
  arr.expenses
    .flatMap(({ freqs }) => freqs)
    .reduce(
      (acc, { name, value }) => Object.assign(acc, { [name]: (acc[name] ?? 0) + value }),
      {}
    )
).map(([name, value]) => ({ name, value }));

console.log(res);

【讨论】:

  • 太棒了!您是阵列大师。我永远不会得到这个。我将分解这些功能以了解它是如何工作的。非常感谢
  • 不错的解决方案。它迫使我删除我的答案。
【解决方案2】:

如果我不知道结构,那么这可能会很困难。但是,鉴于您的意见,我认为这应该可以解决您的问题。

// Your input
let arr = {
    expenses: [
        {
            id: 11,
            freqs: [
                { name: "day", value: 100 },
                { name: "week", value: 200 },
                { name: "month", value: 300 },
            ],
        },
        {
            id: 12,
            freqs: [
                { name: "day", value: 100 },
                { name: "week", value: 200 },
                { name: "month", value: 300 },
            ],
        },
        {
            id: 13,
            freqs: [
                { name: "day", value: 100 },
                { name: "week", value: 200 },
                { name: "month", value: 300 },
            ],
        },
    ],
};
// My code
let result = new Array();
// Create each object structure and push into empty result array
arr.expenses[0].freqs.forEach((item)=>result.push({name: item.name, value: 0}));
// Map through each object in arr.expenses
arr.expenses.map((object)=>{
    // Loop through each object in freqs
    object.freqs.forEach((item)=>{
        result.filter(eachItem=>{
            // Check if result objs' name matches the freqs objs' name
            if(eachItem.name==item.name){
                eachItem.value+=item.value; // Add the values
            }
        })
    });
});
// Check the output
console.log(result);

【讨论】:

    【解决方案3】:

    我们想将频率减少到单个元素,所以我们可以这样做:

    let arr = { expenses: [ { id: 11, freqs: [ {name: "day", value: 100}, {name: "week", value: 200}, {name: "month", value: 300}, ], }, { id: 12, freqs: [ {name: "day", value: 100}, {name: "week", value: 200}, {name: "month", value: 300}, ], }, { id: 13, freqs: [ {name: "day", value: 100}, {name: "week", value: 200}, {name: "month", value: 300}, ], }, ], };
    
    let result = arr.expenses.reduce((total, curr) => {
        total[0].value += curr.freqs[0].value
        total[1].value += curr.freqs[1].value
        total[2].value += curr.freqs[2].value
    
        return total
        }, [{name: "day", value: 0}, {name: "week", value: 0}, {name: "month", value: 0}])
    
    console.log(result)

    【讨论】:

      猜你喜欢
      • 2014-05-24
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 2012-05-06
      • 2015-09-26
      • 2016-08-04
      • 2015-10-20
      • 2022-01-02
      相关资源
      最近更新 更多