通过字母将对象数组转换为字典

时间:2019-06-06 16:12:32

标签: javascript

我有一个看起来像这样的对象数组:

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
  }, {})

但是,这显然不能满足我的要求。我确实对如何实现这一目标有一些想法,但是它们是非常古老的,我很想知道如何正确地做到这一点。 任何帮助表示赞赏!

3 个答案:

答案 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.'); }); Setmapreduce的解决方案:

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],
    }
  }, {});