【问题标题】:Reduce not working as expected?减少不按预期工作?
【发布时间】:2018-08-26 01:55:45
【问题描述】:

我目前正在尝试将数组转换为以数组索引作为创建对象的属性的对象。

示例数组:['a','b','c']

预期对象结果:{'1':'a','2':'b','3':'c'}

我的代码在下面,当我使用 map 方法时它可以工作,但是当我使用 reduce 方法时,它会出现奇怪的方式:

let sampleData = ['a','b','c'];
    
    let convertArrToObjWithIndexProp = (arr) => {
      /*let res = {};
      arr.map((v,k)=> {
      	res[k+1]=v;
      })
      return res;*/
      //--> this outputs {'1':'a','2':'b','3':'c'}
      
      return arr.reduce((iv,cv,i)=>{
        return Object.assign(iv,iv[i+1]=cv);
      },{});
      //--> this outputs instead {'0':'c','1':'a','2':'b','3':'c'}
    }
    console.log(convertArrToObjWithIndexProp(sampleData));

有人能解释一下为什么会这样吗?

使用reduce也比使用map好?

【问题讨论】:

  • Object.assign(iv, {[i+1]: cv}); 应该可以工作。我不知道你的代码目前在做什么,但它看起来很奇怪
  • stackoverflow.com/questions/49469699/array-to-object-reduce 的可能重复 如果您有一个对象数组并且需要复制每个对象,则正确的Object.assign 语法应为:return arr.reduce((iv, cv, i) => Object.assign({}, iv, {[i]: cv}), {});

标签: javascript arrays


【解决方案1】:

问题是这个表达式的结果:iv[i+1]=cvcv,然后你将Object.assign 传递给累加器。您可以通过简单的分配使其更简单:

let sampleData = ['a','b','c'];
    
let convertArrToObjWithIndexProp = (arr) => 
    arr.reduce((iv,cv,i) => (iv[i+1] = cv, iv),{});

console.log(convertArrToObjWithIndexProp(sampleData));

【讨论】:

    【解决方案2】:

    不要使用Object.assign。只需更新您的对象并将其返回即可。

    let sampleData = ['a','b','c'];
        
        let convertArrToObjWithIndexProp = (arr) => {       
          return arr.reduce((iv,cv,i)=>{
             iv[i+1]=cv
             return iv
          },{});
        }
        console.log(convertArrToObjWithIndexProp(sampleData));

    【讨论】:

      【解决方案3】:

      var arr = ['a','b','c'];
      var result = arr.reduce((obj, val, index) => {
        obj[index + 1] = val;
        return obj; 
      }, {});
      
      console.log(result);

      【讨论】:

        【解决方案4】:

        我会使用 Array.reduce 函数和 Object 计算属性。

        var sampleData = ['a', 'b', 'c'];
        console.log(sampleData.reduce((mem, curr, index) => ({ ...mem,
          [index + 1]: curr
        }), {}))

        【讨论】:

          【解决方案5】:

          你可以这样做

          let array = ['a','b','c'];
          return array.reduce((acc, currentValue, index) => {
              const key= index + 1;
              acc[key] = currentValue;
              return acc;
          }, {});
          

          输出会是这样的

          {
            "1": "a",
            "2": "b",
            "3": "c"
          }
          

          【讨论】:

          • JSON 字符串化似乎没有必要
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-15
          • 1970-01-01
          • 1970-01-01
          • 2015-06-26
          • 2013-05-28
          相关资源
          最近更新 更多