javascript - 根据值对对象进行分组

标签 javascript javascript-objects

现在已经把我的头发拉出来几个小时了,是时候从 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 获取索引并递增它以查看下一个项目,但这感觉真的很糟糕。

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

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

注意我已经看到几个与我的问题相关的 SO 问题,但它们遗漏了一个重要因素,即必须按动态值排序,如果值已知,这是一项简单的任务

任何指导将不胜感激

谢谢

最佳答案

有很多方法可以做到这一点。 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)

关于javascript - 根据值对对象进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55818896/

相关文章:

javascript - 仅 vis graph2d y 轴整数

javascript - 计算数组中的对象数,忽略 null

javascript - 访问 angular.forEach 中的父属性

javascript - 如何正确设置 JavaScript 命名空间和类?

javascript - 传递表单数据在 Express/Node.js 中不起作用

javascript myform.action 没有

javascript - 选择特定值时显示新字段(JS/HTML)

JavaScript 按类型和大小对变量进行验证

javascript - 奇怪的 Javascript 变量函数作用域与循环

javascript - Chartjs Array.join