【问题标题】:Grouping listings in an object by attribute按属性对对象中的列表进行分组
【发布时间】:2019-12-19 11:14:33
【问题描述】:

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

[ 
    {
        NAME: 'Mich',
        Age: 52,
        Member: false
    },
    {
        NAME: 'Sarah',
        Age: 21,
        Member: true
    },
    {
        NAME: 'Sarah',
        Age: 90,
        Member: false
    }
]

我想按它们的 Name 属性对它们进行分组,方法如下:

{
    "Sarah":
    [
        {
            NAME: 'Sarah',
            Age: 21,
            Member: true
        },
        {
            NAME: 'Sarah',
            Age: 90,
            Member: false
        }

    ],
    "Mich":
    [
        {
            NAME: 'Mich',
            Age: 52,
            Member: false
        }
    ]
}

我尝试过创建算法,但失败了。请注意,没有预定义的名称列表(名称可以是随机的)。如果您知道如何实现这一点,请告诉我。

【问题讨论】:

    标签: javascript arrays sorting object


    【解决方案1】:

    试试这个

    let d = [
      {
        NAME: 'Mich',
        Age: 52,
        Member: false
      },
      {
        NAME: 'Sarah',
        Age: 21,
        Member: true
      },
      {
        NAME: 'Sarah',
        Age: 90,
        Member: false
      }
    ];
    let group = d.reduce((r, a) => {
      r[a.NAME] = [...r[a.NAME] || [], a];
      return r;
    }, {});
    console.log(group);
    

    【讨论】:

    • 这个解决方案是不必要的 O(n^2),因为每次迭代都会构建一个长度为 O(n) 的新数组。
    【解决方案2】:

    对于每个对象,如果该名称不存在,则为其创建一个数组,并将该对象推送到该数组:

    var byName = {};
    
    people.forEach(person => {
        var name = person.NAME;
        if(!byName[name]) { byName[name] = []; }
        byName[name].push(person);
    });
    

    【讨论】:

      【解决方案3】:

      试试下面的代码:

      var finalObj = {};
          arr.forEach(function(element){
              if(Object.keys(finalObj).includes(element.NAME)){
                  finalObj[element.NAME].push(element)
              } else {
                  finalObj[element.NAME] = [element];
              }
          });
          console.log("fff", finalObj);
      

      【讨论】:

      • 通过在每次迭代中对长度为 O(n) 的数组使用 Array.includes,此解决方案不必要地为 O(n^2)。可以通过其他方式测试对象的key是否存在于O(1)中。
      猜你喜欢
      • 2022-01-21
      • 2021-06-15
      • 2018-08-01
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多