遍历JS中的对象数组

时间:2020-11-10 03:52:42

标签: javascript typescript

我有以下对象:

obj = [
    { 1: 20, 2: 26, 3: 14},
    { 1: 12, 2: 25, 3: 15},
    { 1: 14, 2: 13, 3: 19},
    { 1: 16, 2: 32, 3: 21}
]

我想将每个位置乘以2,然后将它们加到每个位置,让我解释一下: 我将每个值乘以2,这是部分结果:

obj = [
    { 1: 40, 2: 52, 3: 28},
    { 1: 24, 2: 50, 3: 30},
    { 1: 28, 2: 26, 3: 38},
    { 1: 32, 2: 72, 3: 42}
]

然后,我必须添加每个键并通过在初始对象内部的末尾添加新数组来添加总数,这应该是最终结果:

obj = [
    { 1: 20, 2: 26, 3: 14},
    { 1: 12, 2: 25, 3: 15},
    { 1: 14, 2: 13, 3: 19},
    { 1: 16, 2: 32, 3: 21},
    { 1: 104, 2: 200, 3: 138}
]

3 个答案:

答案 0 :(得分:4)

  • 使用map遍历每个数组对象(行)。
  • 然后为该行中的每个键使用reduce将其乘以2,最后返回该行(包含2的乘法结果)
  • 每行乘以2时,我们还要计算每行的key * 2之和。
  • 将sumRow推送到原始对象

let obj = [
  { 1: 20, 2: 26, 3: 14},
  { 1: 12, 2: 25, 3: 15},
  { 1: 14, 2: 13, 3: 19},
  { 1: 16, 2: 32, 3: 21}
]
let sumRow = {}
let partialRes = obj.map(row => Object.keys(row).reduce((acc, key) => {
  acc[key] = row[key] * 2
  sumRow[key] = sumRow[key] ? sumRow[key] + acc[key] : acc[key]
  return acc
}, {}))

obj.push(sumRow)
console.log(obj)

答案 1 :(得分:2)

使用Object.keys,可以获取对象的所有键,并使用Array.prototype.forEach,可以循环键并执行以下操作。

const input = [
  { 1: 20, 2: 26, 3: 14},
  { 1: 12, 2: 25, 3: 15},
  { 1: 14, 2: 13, 3: 19},
  { 1: 16, 2: 32, 3: 21}
];

const sumObj = {};
input.forEach((item) => {
  Object.keys(item).forEach((key) => {
    item[key] *= 2;
    sumObj[key] ? sumObj[key] += item[key] : sumObj[key] = item[key];
  });
});

input.push(sumObj);
console.log(input);

答案 2 :(得分:2)

您可以使用Array.prototype.reduce()并将结果推入原始数组(或以其他方式添加)

obj = [
  { 1: 20, 2: 26, 3: 14},
  { 1: 12, 2: 25, 3: 15},
  { 1: 14, 2: 13, 3: 19},
  { 1: 16, 2: 32, 3: 21}
]

console.log(obj);

obj.push(obj.reduce((acc, val) => ({
  1: acc[1] + val[1] * 2,
  2: acc[2] + val[2] * 2,
  3: acc[3] + val[3] * 2
}), {1: 0, 2: 0, 3: 0}));

console.log(obj);