【问题标题】:Sum array of objects with dynamic keys - Javascript具有动态键的对象数组总和 - Javascript
【发布时间】:2021-10-30 09:58:34
【问题描述】:

我有以下数组

arr = [
  { 'Atencion Personalizada': 2, 'Caja': 3 },
  { 'Atencion Personalizada': 1 },
  { 'Tarifa Social': 3 }
]

预期输出:9

我想以尽可能最短的方式对属性进行汇总。问题是对象键总是可变的,所以我不能去:

arr.reduce((acc,item) => acc+item.keyName)

找到this 的帖子,但也无法使代码适应我的解决方案:

var data = [{ A: 4, B: 2 }, { A: 2, B: 1 }, { A: 3, B: 1 }, { A: 2, B: 1, C: 1 }],
    result = data.reduce((r, o) => (Object.entries(o).forEach(([k, v]) => r[k] = (r[k] || 0) + v), r), {});

提前谢谢你

【问题讨论】:

  • @Andy 回答我正在寻找的是 9

标签: javascript arrays object reduce


【解决方案1】:

这是我的解决方案。映射数组并将属性值展平,然后减少它们。

const arr = [
  { 'Atencion Personalizada': 2, 'Caja': 3 },
  { 'Atencion Personalizada': 1 },
  { 'Tarifa Social': 3 }
]

console.log(arr.flatMap(e => Object.values(e)).reduce((a, b) => a + b));

【讨论】:

  • 这就是我想要的,谢谢!在我的脑海里似乎比实际上更容易
【解决方案2】:

两次使用reduce,一次在外部数组上,一次在其中每个对象的值上。

const arr = [
  { 'Atencion Personalizada': 2, 'Caja': 3 },
  { 'Atencion Personalizada': 1 },
  { 'Tarifa Social': 3 }
];
const total = arr.reduce((gt, item) => 
  gt + Object.values(item).reduce((t, sub) => t + sub, 0)
, 0);

console.log(total);

【讨论】:

    【解决方案3】:

    也许是这样的?

    let acc = {};
    for (let o of arr) for (let key in o) {
        acc[key] ??= 0;
        acc[key] += o[key];
    }
    

    虽然不是单线

    【讨论】:

    • 是的,我是这么想的,但我正在努力提高我的 javascript 技能。谢谢!
    • @juanmac,让代码更有意义并没有错。单行词很难理解。
    • 请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。
    【解决方案4】:

    你可以这样做:

    total = arr.reduce((acc,item) => {
         const values = Object.values(item)
         values.forEach(item=> acc += item)
        return acc;
    }, 0);
    

    检查我将第一个值 (0) 作为第二个参数传递给 reduce 方法。

    【讨论】:

      【解决方案5】:

      希望这会有所帮助:

      arr = [
        { 'Atencion Personalizada': 2, 'Caja': 3 },
        { 'Atencion Personalizada': 1 },
        { 'Tarifa Social': 3 }
      ]
      
       var sum = arr.map(item => {
          var x = 0
          for (const [key, value] of Object.entries(item)) {
              x+=value
          }
          return x
      }).reduce( (acc, curr) => acc + curr)
      console.log(sum)

      【讨论】:

        【解决方案6】:

        arr = [
          { 'Atencion Personalizada': 2, 'Caja': 3 },
          { 'Atencion Personalizada': 1 },
          { 'Tarifa Social': 3 }
        ]
        var total = 0;
        arr.forEach((x, i) => 
            total += Object.values(x).reduce((a,b) => a+b)
        );
        console.log(total)

        【讨论】:

          【解决方案7】:

          用这种方法解决它:

          • 使用JSON.stringify 获取arr 作为字符串。
          • 提取与正则表达式匹配的数字\d+ 和标记g 以将其作为组返回。
          • 将其映射到实数而不是字符串。
          • 将其减少为所有数字的总和。
          JSON.stringify(arr) //'[{"Atencion Personalizada":2,"Caja":3},{"Atencion Personalizada":1},{"Tarifa Social":3}]'
          .match(/\d+/g) //['2', '3', '1', '3']
          .map(Number) //[2, 3, 1, 3]
          .reduce((acc, n)=>acc+n, 0) //9
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-07-17
            • 2022-01-06
            • 2017-02-07
            • 2021-06-06
            • 2017-01-17
            • 1970-01-01
            • 2022-09-24
            相关资源
            最近更新 更多