Reputation: 43651
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
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
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