数组到对象减少

时间:2018-03-24 20:39:14

标签: javascript arrays object reduce

您好我想将数组转换为对象

输入= [1,2,3]

预期产出= {1:1,2:2,3:3}

我试过这个

const arrToObj = (arr) => {
  arr.reduce((acc, curr, i, arr)=> {
    acc[curr]=arr[i]
  },{})
}
console.log(arrToObj([1,2,3,4,5,6,7,8,9]))

但它在第二次迭代中抛出错误。 有什么问题以及如何使其发挥作用?

3 个答案:

答案 0 :(得分:0)

这样的事情?

const arr = [1,2,3,4,5,6,7,8,9]
const obj = arr.reduce((accumulator, currentValue, index) => {
  accumulator[index+1] = currentValue;
  return accumulator;
}, {});

console.log(obj)

答案 1 :(得分:0)

到目前为止你所尝试的有两个问题

第一个是严肃的:

您忘记从累积函数返回,因此返回undefined

它第二次抛出因为Array.prototype.reduce将指定的种子作为第一次调用累加函数的第一个参数传递,但是在第二次调用时,它传递第一次调用的结果。

所以最初,减少调用你的函数

result = accumulatorFunction(seed, arr[0], 0, arr);

扩展为

result = accumulatorFunction({}, 1, 0, [1, 2, 3]);

然而,后续调用看起来像这样

result = accumulatorFunction(result, arr[1], 1 arr);

扩展为

result = accumulatorFunction(undefined, 2, 1, [1, 2, 3]);

所以你需要写一些像

这样的东西
arr.reduce((acc, curr, i, arr) => {
  acc[curr] = arr[i];
  return acc;
}, {});

您的代码的另一个问题,以及更多的样式,是您不必要地提供和使用传递给累积函数的第四个参数。无论如何,这个论点只是数组本身。使用它很尴尬,使你的代码更复杂,更容易出错,更难理解。

改为写

arr.reduce((acc, curr) => {
  acc[curr] = curr;
  return acc;
}, {});

"use strict";

const input = [1, 2, 3];

const output = input.reduce((acc, curr) => {
  acc[curr] = curr;
  return acc;
}, {});

console.log(output);

答案 2 :(得分:0)

const arrToObj = a => a.reduce((r, v) => (r[v] = v, r), {})

console.log( arrToObj( [1, 2, 3] ) )

如果值与索引匹配,使用ECMAScript 2018 Spread syntax可以更简单:

console.log( { ...[, 1, 2, 3] } )