Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaScript Equivalent of C# ToDictionary

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?

like image 574
Bondolin Avatar asked Jun 09 '26 08:06

Bondolin


2 Answers

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}`) });
like image 146
user3297291 Avatar answered Jun 10 '26 21:06

user3297291


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; }
like image 23
Nina Scholz Avatar answered Jun 10 '26 20:06

Nina Scholz



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!