减少无法按预期工作?

时间:2018-08-25 16:20:45

标签: javascript arrays

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

示例数组:['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更好吗?

5 个答案:

答案 0 :(得分:3)

问题在于该表达式的结果: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));

答案 1 :(得分:1)

请勿使用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));

答案 2 :(得分:0)

您可以通过执行此操作

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"
}

答案 3 :(得分:0)

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

console.log(result);

答案 4 :(得分:0)

我将使用String函数和对象计算属性来完成此操作。

val xmlResourceParser: XmlResourceParser = resources.getXml(R.xml.your_xml_file_name)