代码之家  ›  专栏  ›  技术社区  ›  connexo

在array.reduce中使用对象解构

  •  1
  • connexo  · 技术社区  · 7 年前

    我是想解决别人的问题 Array.prototype.reduce ...object 破坏结构。我不明白为什么当我使用 Object.assign ,但在使用Spread运算符时不会。

    const str = 'Jack:13,Phil:15,Lucy:12'
    
    const arr = str.split(',')
    
    let reducer = (acc, val) => {
      return { ...acc,
        ...{
          [val.split(':')[0]]: Number(val.split(':')[1])
        }
      }
    }
    
    let reducer2 = (acc, val) => {
      return Object.assign(acc, {
        [val.split(':')[0]]: Number(val.split(':')[1])
      })
    }
    
    let obj = {
      Jody: 29
    }
    
    let obj2 = {
      Julie: 28
    }
    
    arr.reduce(reducer, obj)
    arr.reduce(reducer2, obj2)
    
    console.log(obj)
    /* output:
    {
      "Jody": 29
    }
    */
    console.log(obj2)
    /* output:
    {
      "Julie": 28,
      "Jack": 13,
      "Phil": 15,
      "Lucy": 12
    }
    */
    1 回复  |  直到 7 年前
        1
  •  1
  •   Estus Flask    7 年前

    数组 reduce 通常用于返回新值。即使它使累加器发生变异,也可以安全地假设它可以返回一个新值。

    arr.reduce(reducer, obj) 就凭这个 obj 变异。 reducer2 确实,这就是它工作的原因。但这与 reducer 使累加器保持不变。

    应该是:

    obj = arr.reduce(reducer, obj);