首页 > 解决方案 > 根据值对对象进行分组

问题描述

现在已经把我的头发拉了几个小时了,所以是时候向 SO 寻求帮助了

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

const data = [
  {city: "London", surname: "jones"},
  {city: "Manchester", surname: "jones"},
  {city: "Leeds", surname: "smith"},
  {city: "Birmingham", surname: "smith"},
  {city: "Rhyl", surname: "clarkson"},
  {city: "Blackpool", surname: "walker"},
  {city: "Rhyl", surname: "walker"},
  {city: "Blackpool", surname: "fletcher"}
];
// Actual data is much more complex, this is just a simplified example

在此示例中,我基本上是在尝试根据字段对数据进行分组surname。姓氏值事先不知道,因此它需要是动态的。因此,您将查看数组中的下一项,如果它与分组的前一项匹配,如果不匹配,则开始一个新组。

最终结果将如下所示:

const outcome = {
  jones: [...2 objects],
  smith: [...2 objects],
  clarkson: [...1 objects],
  walker: [...2 objects],
  fletcher: [...1 objects]
}

我最初的想法是我需要遍历每个项目并将其与下一个项目进行比较,因此最初查看了 reduce 但无法做到这一点,所以我开始遍历data数组中的项目并将其与下一个项目进行比较(通过从中获取索引map并增加它以查看下一个项目,但这感觉真的很hacky。

算法和 CS 不是我的强项,但我觉得我做这件事的方式很脏,而且已经有一个模式,因为它必须是一项常见的任务

我的下一个方法是循环遍历每个 add 向数据中添加一些东西,例如groupingid,即group: 1,保持一个增量,并且只要a 与前++一个surname不匹配,但这听起来仍然不是“最佳”,因为 id 然后必须运行一个filter在每个组上以正确格式获取数据。

注意我已经看到了几个与我的问题相关的 SO 问题,但他们错过了一个关于必须按动态值排序的重要因素,如果这些值是已知的,这是一项容易的任务

任何指导将不胜感激

谢谢

标签: javascriptjavascript-objects

解决方案


有很多方法可以做到这一点。这reduce是最好的,我想到了。

请参阅以下代码段:

const data = [
  {city: "London", surname: "jones"},
  {city: "Manchester", surname: "jones"},
  {city: "Leeds", surname: "smith"},
  {city: "Birmingham", surname: "smith"},
  {city: "Rhyl", surname: "clarkson"},
  {city: "Blackpool", surname: "walker"},
  {city: "Rhyl", surname: "walker"},
  {city: "Blackpool", surname: "fletcher"}
];

function group(array,field){
    return array.reduce((acc,elem)=>{
        //whether the field value exist
        if(acc[elem[field]]){
            //if the field value exist, push elem to it:
            acc[elem[field]].push(elem)
        }else{
            //if the field value doesn't exist, create an array with elem:
            acc[elem[field]]=[elem]
        }
        //return accumulator for later use
        return acc
    },{})
}

const outcome = group(data,"surname")

console.log(outcome)


推荐阅读