如果存在嵌套值,则对其求和

时间:2019-04-18 16:54:46

标签: javascript

我有一个看起来像这样的数组:

const values = [
  {
    value: 2000,
    items: [
      {
        value: 300,
      },
    ],
  },
]

我想对values.value中所有值的总和求和,如果存在values.items.value,我也想将其包括在求和中。

values.reduce((total, obj) => obj.value + total, 0);

什么是键入嵌套数组的正确方法,以便它对我的reduce函数中的顶部和嵌套value键进行求和?我想要的输出是2300,但是现在我只能深入一层,并且输出2000

4 个答案:

答案 0 :(得分:3)

您可以使用reduce add value并检查items是否存在,然后再添加items数组的值

const values = [{value: 2000,items: [{value: 300,},],},]


let op = values.reduce((op,{value,items}) => {
  op+= value
  if(items && items.length) {
    items.forEach(({value})=> op+=value )
  }
  return op
},0)

console.log(op)

答案 1 :(得分:3)

您可以嵌套reduce方法来处理内部数组,同时确保键存在于内部数组对象中。

const values = [
  {
    value: 2000,
    items: [
      {
        value: 300,
      },
    ],
  },
];

const total = values.reduce((acc, obj) => {
  acc += obj.value;
  acc += obj.items.reduce((a, o) => 'value' in o ? o.value + a : a, 0);
  return acc;
  }, 0);

console.log(total);
// 2300

答案 2 :(得分:1)

您可以迭代对象的键/值并求和嵌套对象的总和,然后将所需的键或零作为起始值。

function sum(object, key) {
    return Object.entries(object).reduce((s, [k, v]) => {
        if (v && typeof v === 'object') return s + sum(v, key);
        return s;
    }, key in object ? object[key] : 0);
}

const values = [{ value: 2000, items: [{ value: 300 }] }];

console.log(sum(values, 'value'));

答案 3 :(得分:0)

我将添加一个内部reduce()以获取items数组的累加和。另外,为了安全起见,我将使用isNaN()Array.isArray()添加一些检查:

const values = [
  {value: 2000, items: [{value: 300}]},
  {value: 3000},
  {value: 2000, items: [{value: 300}, {foo: 20}]},
  {nothing: "nothing"}
];

let res = values.reduce((acc, {value, items}) =>
{
    acc += isNaN(value) ? 0 : value;
    acc += Array.isArray(items) ?
           items.reduce((sum, {value}) => sum + (isNaN(value) ? 0 : value), 0) :
           0;
    return acc;
}, 0);

console.log(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}