JavaScript 等效于 C# ToDictionary

Bon*_*lin 1 javascript dictionary functional-programming

我正在寻找一种方法来获取以下列表:

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"
    }
]
Run Code Online (Sandbox Code Playgroud)

并在键上制作字典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"
    }
}
Run Code Online (Sandbox Code Playgroud)

这类似于 C#ToDictionary方法。我知道我可以directoryfor循环或.each调用中进行迭代,并修改dictionary每次迭代的值。但是,我更愿意进行类似函数式编程的分配,例如

dictionary = directory.toDictionary(p => p.name);
Run Code Online (Sandbox Code Playgroud)

在 ES6 或 lodash 中是否存在这样的方法?

use*_*291 6

JavascriptMap非常类似于字典。它的实例具有方便has、、、、方法。它也可以通过方法直接迭代。getsetkeysvaluesforEach

Map您可以使用“键值对”数组构造一个。(用引号引起来,因为实际上我们以某种类似元组的方式使用数组)。

要创建一个Map用作字典,您需要执行以下操作:

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}`) });
Run Code Online (Sandbox Code Playgroud)


Nin*_*olz 5

您可以映射键和值,并使用 (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);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)

经典方法

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);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)