I am looking for a way to take the following list:
directory = [
{
name: "Albert",
age: 40,
gender: "M"
},
{
name: "Suzanne",
age: 27,
gender: "F"
},
{
name: "Robert",
age: 19,
gender: "M"
},
{
name: "Connie",
age: 87,
gender: "F"
}
]
and make a dictionary on the key name:
dictionary = {
"Albert": {
name: "Albert",
age: 40,
gender: "M"
},
"Suzanne": {
name: "Suzanne",
age: 27,
gender: "F"
},
"Robert": {
name: "Robert",
age: 19,
gender: "M"
},
"Connie": {
name: "Connie",
age: 87,
gender: "F"
}
}
This is similar to the C# ToDictionary method. I know I could do something like iterate over directory in a for loop or .each call, and modify the value of dictionary each iteration. I would prefer, however, to make a functional programming-like assignment instead, e.g.
dictionary = directory.toDictionary(p => p.name);
Does such a method exist, say within ES6 or lodash?
Javascript's Map closely resembles a dictionary. Its instances sport handy has, get, set, keys, values methods. It's also directly iterable via a forEach method.
You can construct a Map using an array of "key-value-pairs". (in quotes, because in reality we're using arrays in some tuple-like fashion).
To create a Map to use as a dictionary, you'd do:
const directory=[{name:"Albert",age:40,gender:"M"},{name:"Suzanne",age:27,gender:"F"},{name:"Robert",age:19,gender:"M"},{name:"Connie",age:87,gender:"F"}];
const myDict = new Map(
directory.map(p => [p.name, p])
);
console.log("Has Albert:", myDict.has("Albert"))
myDict.forEach(p => { console.log(`${p.name} has age ${p.age}`) });
You could map key and value and create an object from this arrays with (upcoming) Object.fromEntries.
var directory = [{ name: "Albert", age: 40, gender: "M" }, { name: "Suzanne", age: 27, gender: "F" }, { name: "Robert", age: 19, gender: "M" }, { name: "Connie", age: 87, gender: "F" }],
result = Object.fromEntries(directory.map(o => [o.name, o]));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
A classic approach
var directory = [{ name: "Albert", age: 40, gender: "M" }, { name: "Suzanne", age: 27, gender: "F" }, { name: "Robert", age: 19, gender: "M" }, { name: "Connie", age: 87, gender: "F" }],
result = Object.assign({}, ...directory.map(o => ({ [o.name]: o })));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With