【问题标题】:Why does my reduce accumulator reset?为什么我的减少累加器重置?
【发布时间】:2018-10-18 07:10:24
【问题描述】:

如何保留reduce 函数的累积值?每次迭代都会重置对象值。

const a = [1, 2, 3, 4, 5];

const b = {
  1: {
    name: 'Dan',
    age: 25
  },
  2: {
    name: 'Peter',
    age: 28
  },
  3: {
    name: 'Mark',
    age: 38
  },
  4: {
    name: 'Larry',
    age: 32
  },
  5: {
    name: 'Simon',
    age: 25
  },
}

const f = a.reduce((acc, val) => {
  console.log({
    acc
  })
  return {
    [val]: {
      age: b[val].age
    }
  }
}, {})

console.log(f); // 5: {age: 25}

我想要的结果是:

{
  1: { age: 25 },
  2: { age: 28 },
  3: { age: 38 },
  4: { age: 32 },
  5: { age: 25 },
}

(此示例为演示)

【问题讨论】:

    标签: javascript arrays reduce


    【解决方案1】:

    使用object spread(如本例)或Object.assign()将前一个累加器添加到返回值:

    const a = [1, 2, 3, 4, 5];
    
    const b = {"1":{"name":"Dan","age":25},"2":{"name":"Peter","age":28},"3":{"name":"Mark","age":38},"4":{"name":"Larry","age":32},"5":{"name":"Simon","age":25}};
    
    const f = a.reduce((acc, val) => ({
      ...acc, // previous accumulator
      [val]: {
        age: b[val].age
      }
    }), {})
    
    console.log(f); // 5: {age: 25}

    【讨论】:

    • 为了保持安全(清晰),您可以这样做Object.keys(b).reduce(...)
    • @AlexanderWallin - 你也可以使用Object.entries() 来获取键和值。顺便说一句 - Object.keys/values/entries 将保留数字顺序。
    【解决方案2】:

    根据MDN

    reduce() 方法对累加器和数组中的每个元素(从左到右)应用一个函数,以将其减少为单个值。

    在每次迭代中,您都会在 reduce() 函数内返回新对象,并且您不会存储该累加器的先前值。所以你需要合并或用新值分配以前的值。

    您可以使用Object.assign() 方法获得所需结果的一种方式。

    演示

    const a = [1, 2, 3, 4, 5];
    
    const b = {1: {name: 'Dan',age: 25},2: {name: 'Peter',age: 28},3: {name: 'Mark',age: 38},4: {name: 'Larry',age: 32},5: {name: 'Simon',age: 25}}
    
    let result = a.reduce((acc, val) => Object.assign(acc,{[val]: {age:b[val].age}}), {});
    
    console.log(result);
    .as-console-wrapper {max-height: 100% !important;top: 0;}

    第二种方法你可以这样做obje[val]=newValue并返回累加器。

    演示

    const a = [1, 2, 3, 4, 5];
    
    const b = {1: {name: 'Dan',age: 25},2: {name: 'Peter',age: 28},3: {name: 'Mark',age: 38},4: {name: 'Larry',age: 32},5: {name: 'Simon',age: 25}}
    
    let result = a.reduce((acc, val) =>{
    acc[val]= {age:b[val].age};
    return acc;
    }, {});
    
    console.log(result);
    .as-console-wrapper {max-height: 100% !important;top: 0;}

    您可以使用spread syntax 组合的另一种方式

    演示

    const a = [1, 2, 3, 4, 5];
    
    const b = {1: {name: 'Dan',age: 25},2: {name: 'Peter',age: 28},3: {name: 'Mark',age: 38},4: {name: 'Larry',age: 32},5: {name: 'Simon',age: 25}}
    
    let result = a.reduce((acc, val) => {
    return {...acc,...{[val]:{age:b[val].age}}}
    }, {});
    
    console.log(result);
    .as-console-wrapper {max-height: 100% !important;top: 0;}

    【讨论】:

      【解决方案3】:

      如果您的 reduce 函数中碰巧有 if else 语句,您的 reduce 累加器也可以重置,即您为 if 语句返回一个累加器,但忘记处理 else 语句并且不返回累加器 - 在这种情况下,当else 语句被触发,没有返回累加器,累加器变为未定义。

      例如这有效:

      let reducedArray = array.reduce((acc, curr) => {
                if (
                  curr[
                    property_name
                  ]
                ) {
                  return {
                    ...acc,
                    ...{
                      [curr.id]:
                        (acc[curr.id] ?? 0) +
                        curr[
                          property_name
                        ]!
                    },
                  };
                } else {
                  return acc;
                }
              }, {} as { [key: string]: number });
      

      但这行不通:

      let reducedArray = array.reduce((acc, curr) => {
                if (
                  curr[
                    property_name
                  ]
                ) {
                  return {
                    ...acc,
                    ...{
                      [curr.id]:
                        (acc[curr.id] ?? 0) +
                        curr[
                          property_name
                        ]!
                    },
                  };
                }
              }, {} as { [key: string]: number });
      

      【讨论】:

        猜你喜欢
        • 2015-06-04
        • 2018-01-23
        • 2022-01-08
        • 2014-12-16
        • 2018-08-05
        • 2015-05-18
        • 2017-02-21
        • 2019-03-03
        • 2020-05-01
        相关资源
        最近更新 更多