【问题标题】:Convert an array of objects to a dictionary by letter [duplicate]按字母将对象数组转换为字典[重复]
【发布时间】:2019-10-22 04:49:58
【问题描述】:

我有一个如下所示的对象数组:

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

但这显然不能达到我想要的效果。我确实有一些关于如何使这成为可能的想法,但它们是非常传统的,我很想知道如何正确地做到这一点。 任何帮助表示赞赏!

【问题讨论】:

    标签: javascript


    【解决方案1】:

    您需要第一个字符、大写字母和一个数组来收集对象。

    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);

    【讨论】:

    • 非常感谢您的帮助!
    【解决方案2】:

    这是一个基于Setmapreducefilter的解决方案:

    let stuff = [{"id": "48202847","name": "Doe"},{"id": "17508","name": "Marie"},{"id": "175796","name": "Robert"},{"id": "175796","name": "Ronald"}];
    
    let result = [...new Set(stuff.map(x => x.name[0]))]
      .reduce((acc, val) => {
        return acc = { ...acc,
          [val]: stuff.filter(x => x.name.startsWith(val))
        }
      }, {});
    
    console.log(result);

    【讨论】:

      【解决方案3】:

      很好的解决方案尼娜!可以通过使用扩展运算符来变得更简洁。

      const byId = (array) =>
        array.reduce((obj, item) => {
          var key = item.name[0].toUpperCase();
          return {
            ...obj,
            [key]: obj[key] ?  [...obj[key], item] : [item],
          }
        }, {});
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-18
        • 1970-01-01
        • 1970-01-01
        • 2021-05-30
        • 2016-10-28
        • 2018-07-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多