减少javascript中的嵌套对象数组

时间:2021-06-18 15:33:29

标签: nested javascript-objects reduce

所以我有这个数组,我想用一个reduce函数返回lci的总和和mci的总和

const data = [{ option:{ lci: 1, mci: 2 } }, { option:{ lci: 3, mci: 4 } }, { option:{ lci: 5, mci: 6 } }];

我已经试过了,但它不起作用:

 data.reduce( (previousValue, currentValue) => {
    return {
      totalLCI: previousValue.option.lci + currentValue.option.lci,
      totalMCI: previousValue.option.lci + currentValue.option.lci,
    };
  })

2 个答案:

答案 0 :(得分:1)

reduce 方法需要 2 个重要参数:reduce 函数和迭代第 0 步的默认值

这里的reducer有2个参数:

  • 所谓的previousValue:这里称为reducerTarget,因为它接收reducer主体中返回的内容
  • reducer 所在的 currentValue:这里称为 currentArrayItem

这就是你可能想要的

    const {totalLCI, totalMCI} = data.reduce((reducerTarget, currentArrayItem) => { 
        return {
            totalLCI: reducerTarget.totalLCI + currentArrayItem.option.lci,
            totalMCI: reducerTarget.totalMCI + currentArrayItem.option.mci
        }
    }, {totalLCI: 0, totalMCI: 0})

从这里开始,从默认值开始,它在第一次迭代时的作用是

/* 1st step: 
    index = 0
    targetReducer = defaultValue = {totalMCI: 0, totalLCI: 0}
    currentArrayItem = {option: {lci: 1, mci: 2}}
*/
        return {
            totalLCI: 0 + 1,
            totalMCI: 0 + 2
        }

/* 2nd step: 
    index = 1
    targetReducer = previousValue = {totalMCI: 1, totalLCI: 2}
    currentArrayItem = {option: {lci: 3, mci: 4}}
*/
        return {
            totalLCI: 1 + 3,
            totalMCI: 2 + 4
        }

答案 1 :(得分:1)

首先,您需要知道字段 totalLCItotalMCI 中是否存储了值,如果未设置,请添加 上一个 值和 当前值,添加后,返回值,在下一次迭代中,您将再次检查数据是否存储在totalLCItotalMCI中,之后,您将获得存储在该字段并一直求和直到完成迭代,这里是一个例子:

var data2 = [{ option:{ lci: 1, mci: 2 } }, { option:{ lci: 3, mci: 4 } }, { option:{ lci: 5, mci: 6 } }];

let test = data2.reduce( (previousValue, currentValue) => {
    
    if(!previousValue.totalLCI && !previousValue.totalMCI){

        return {
          totalLCI: previousValue.option.lci + currentValue.option.lci,
          totalMCI: previousValue.option.mci + currentValue.option.mci
        };
    }else{
        return{
            totalLCI: previousValue.totalLCI + currentValue.option.lci,
            totalMCI: previousValue.totalMCI + currentValue.option.mci
        }

    }
  });



console.log(test.totalLCI);
console.log(test.totalMCI);