现在已经把我的头发拉出来几个小时了,是时候从 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/