1

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

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

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

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

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

4

4 回答 4

3

您可以使用减少添加值并检查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)

于 2019-04-18T16:58:30.990 回答
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

于 2019-04-18T17:07:19.933 回答
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;}

于 2019-04-18T17:07:55.340 回答
0

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

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

于 2019-04-18T17:28:17.327 回答