具有动态键的对象总和数组 - Javascript

Sum array of objects with dynamic keys - Javascript

我有以下数组

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

预期输出:9

而且我想以最短的方式求和属性。问题是对象键总是可变的,所以我不能去:

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

找到 post 但也无法使代码适应我的解决方案:

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), {});

提前致谢

也许是这样的?

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

虽然不是单线

你可以这样做:

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

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

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)

希望这会有所帮助:

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)

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

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

使用 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);

用这种方法解决:

  • 使用 JSON.stringify 将 arr 作为字符串获取。
  • 使用正则表达式 \d+ 匹配提取数字,并将 g 标记为 return 作为组。
  • 将其映射为实数而不是字符串。
  • 将其减少为所有数字的总和。
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