javascript - 根据值对对象进行分组
问题描述
现在已经把我的头发拉了几个小时了,所以是时候向 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 向数据中添加一些东西,例如grouping
id,即group: 1
,保持一个增量,并且只要a 与前++
一个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)
推荐阅读
- reactjs - 通过 https 云功能发送推送通知
- python - Python将完整错误保存到日志文件
- wpa - 如何在为 Android 生成的 WPA 应用程序中隐藏 url 栏?
- r - Power BI ARIMA 预测自定义视觉与脚本视觉
- c# - 如何保存列表
> 作为 SQLite 表? - reactjs - 尽管状态正在更新,Redux 不会重新渲染组件
- database - 我需要优化 mongo 集合更新
- javascript - 使用 Firefox Linux plus Selenium 下载 JavScript 生成的文件,无需确认
- java - 部署时未创建 JMS Glassfish 连接器
- ruby-on-rails - RSpec 错误 ActionController::UrlGenerationError: 测试控制器时