我有一个看起来像这样的对象数组:
let stuff = [
{
"id": "48202847",
"name": "Doe"
},
{
"id": "17508",
"name": "Marie"
},
{
"id": "175796",
"name": "Robert"
},
{
"id": "175796",
"name": "Ronald"
},
]
我想要的是一本看起来像这样的字典:
{
"D": [{"id": "48202847", "name": "Doe"}],
"M": [{"id": "17508", "name": "Marie"}],
"R": [{"id": "175796", "name": "Robert"}, {"id": "175796", "name": "Ronald"}]
}
请注意,一个键下列出了所有以“ R”开头的人的名字。
这是我的功能,用于创建以该人的姓名为键的字典:
const byId = (array) =>
array.reduce((obj, item) => {
obj[item.name] = item
return obj
}, {})
但是,这显然不能满足我的要求。我确实对如何实现这一目标有一些想法,但是它们是非常古老的,我很想知道如何正确地做到这一点。 任何帮助表示赞赏!
答案 0 :(得分:5)
您需要第一个字符,大写字母和一个数组来收集对象。
const byId = array =>
array.reduce((obj, item) => {
var key = item.name[0].toUpperCase(); // take first character, uppercase
obj[key] = obj[key] || []; // create array if not exists
obj[key].push(item); // push item
return obj
}, {});
let stuff = [{ id: "48202847", name: "Doe" }, { id: "17508", name: "Marie" }, { id: "175796", name: "Robert" }, { id: "175796", name: "Ronald" }],
result = byId(stuff)
console.log(result);
答案 1 :(得分:0)
以下是基于window.addEventListener('blur', function (event) {
console.log('Window closing.');
});
,Set
,map
和reduce
的解决方案:
filter
答案 2 :(得分:0)
很棒的解决方案Nina!通过使用传播算子可以使它更干净。
const byId = (array) =>
array.reduce((obj, item) => {
var key = item.name[0].toUpperCase();
return {
...obj,
[key]: obj[key] ? [...obj[key], item] : [item],
}
}, {});