lexicore
lexicore

Reputation: 43651

Convert array to object in JavaScript

I'd like to convert an array into an object using one of the properties as key.

For instance:

var stations = [ { name: 'A Coruna', ds100: 'OECSC' }, ... ];

I'd like to get stationByDs100:

{ 'OECSC': { name: 'A Coruna', ds100: 'OECSC' }, ... }

At the moment I do it as follows:

var stationByDs100 = {};
stations.forEach(station => stationByDs100[station.ds100] = station);

I'm looking for a better way to accomplish this - is it possible with a one-liner without explicit variable declaration?

For instance in Java 8 this could have accomplished with streams and collectors in one line like:

Map<String, Station> stationByDs100 = stations.stream()
    .collect(toMap(Station::getDs100, identity()));

So I was thinking maybe there's a similar way in JS.

I'm using Node.js so OK to use the latest JS/ES features Node.js supports.

I've browsed through a rougly dozen existing answers but they mostly use older JS/ES versions and suggest even longer solutions.

Upvotes: 2

Views: 3612

Answers (2)

trincot
trincot

Reputation: 350137

Object.fromEntries can help with this:

const stations = [{ name: 'Berlin Südkreuz', ds100: 'BPAF' }, { name: 'Berg', ds100: 'KBEG' }];
const object = Object.fromEntries(stations.map(o => [o.ds100, o]));
console.log(object);

Upvotes: 0

Nina Scholz
Nina Scholz

Reputation: 386550

You could use Object.assign with computed property names.

var stations = [ { name: 'A Coruna', ds100: 'OECSC' }],
    object = stations.reduce((o, a) => Object.assign(o, { [a.ds100]: a }), {});

console.log(object);

Upvotes: 9

Related Questions