0

Hello I want to transform array to object

input = [1,2,3]

expected output = {1:1,2:2,3:3}

I tried this

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]))

but it throws errror in second iteration. What is wrong and how to make it work?

simon.ro
  • 2,984
  • 2
  • 22
  • 36
Luke
  • 417
  • 1
  • 7
  • 18

3 Answers3

0

something like this?

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)
Fecosos
  • 944
  • 7
  • 17
0

What you have tried so far has two problems

The first is serious:

You forgot to return from your accumulating function, so it returns undefined.

It throws the second time around because Array.prototype.reduce passes the specified seed as the first argument on the first call to the accumulating function but, on the second call, it passes the result of the first call.

So initially, reduce calls your function like this

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

which expands to

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

The subsequent call, however, looks like this

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

which expands to

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

So you need to write something like

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

Another issue with your code, and more one of style, is that you needlessly provide and use the fourth argument passed to the accumulating function. This argument is just the array itself anyway. Using it is awkward and makes your code more complex, more prone to mistakes, and harder to understand.

Instead write

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);
Aluan Haddad
  • 29,886
  • 8
  • 72
  • 84
0

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

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

If the values match the indexes, it can be even simpler with ECMAScript 2018 Spread syntax :

console.log( { ...[, 1, 2, 3] } )
Slai
  • 22,144
  • 5
  • 45
  • 53