turning an array into an object using es6 map

Viewed 90

I currently have the following data structure:

const bar = [
    {id:1, version:0, name:"test name A"},
    {id:2, version:0, name:"test name B"},
    {id:3, version:0, name:"test name C"}
];

And I need to turn it into this:

const foo = {
    1:{id:1, version:0, name:"test name A"},
    2:{id:2, version:0, name:"test name B"},
    3:{id:3, version:0, name:"test name C"}
};

The piece of code I actually have is this:

for(let i=0;len = bar.length; i< len;i++){
    foo[bar[i].id]= bar[i];
}

I've tried doing

bar.map((element,index)=>{
    const temporal = {[index]:element};
    foo = {...foo, temporal};
});

but I'm lost, any suggestions?

5 Answers

You can use reduce() with Object.assign()

const bar = [
    {id:1, version:0, name:"test name A"},
    {id:2, version:0, name:"test name B"},
    {id:3, version:0, name:"test name C"}
];

var result = bar.reduce((r, e) => Object.assign(r, {[e.id]: e}), {});
console.log(result)

You could use Object.assign with Array#map and spread syntax ...

const
    bar = [{ id: 1, version: 0, name: "test name A" }, { id: 2, version: 0, name: "test name B" }, { id: 3, version: 0, name: "test name C" }],
    object = Object.assign(...bar.map(o => ({ [o.id]: o })));

console.log(object);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Array.map returns an array, if you wanted to return an object, you could use Array.reduce instead

const bar = [
    {id:1, version:0, name:"test name A"},
    {id:2, version:0, name:"test name B"},
    {id:3, version:0, name:"test name C"}
];

var foo = bar.reduce( (a,b,i) => (a[i+1] = b, a), {});

console.log(foo);

If you just need to reformat the data for sending it to an API, there's no need to create true clones of the objects with Object.assign

You can use reduce, aka fold or inject in general:

const bar = [
    {id:1, version:0, name:"test name A"},
    {id:2, version:0, name:"test name B"},
    {id:3, version:0, name:"test name C"}
];

bar.reduce((obj, e, i) => { obj[e.id] = e; return obj}, {});

Another way could be to use forEach which iterates over the array, but doesn't return an array as map does:

let foo = {};
bar.forEach((el, idx) => foo[idx+1] = el)
Related