对数组里面的对象根据一定的规则进行分类
最近碰到一个需求,很简单,对数组里面的对象进行分类,这个需求是根据对象的某个对象进行分类的,例如这样:
[
{
"category": "测试流程1",
"title": "1112",
},
{
"category": "测试流程2",
"title": "ddd",
},
{
"category": "测试流程2",
"title": "vvvv",
},
{ "category": "测试流程1",
"title": "14442",
},
...
]
类似上面这样的数据,可能会有 测试流程3、测试流程4…,每个流程分类下可能都要很多数据,现在要把流程分类相同的数据放在一起,分成这样的数据:
[
[{
"category": "测试流程1",
"title": "1112",
},{ "category": "测试流程1",
"title": "14442",
}],
[{
"category": "测试流程2",
"title": "ddd",
},{
"category": "测试流程2",
"title": "vvvv",
}]
...
]
================================
好了,需求介绍到这里。原始的解决方法就是先数组所有的分类先遍历再去重,然后再遍历一遍,分类相同的放在一起,优点代码浅显易懂,缺点是遍历次数太多了,浪费性能。
无意中看到 reduce 这个api,这个api好像可以做很多事,于是尝试用reduce实现这个需求(简化了很多):
const result = data.reduce((a, b) => {
if (a[b.category]) {
a[b.category].push(b);
} else {
a[b.category] = [b];
}
return a
}, {});
console.log(result);
传入一个空的对象,如果没有分类,则创建这个分类,并赋值一个数组,如果已经有这个分类,则把当前数据push到分类对应的数组,是不是so easy
==========================================================
重点:其实用forEach也可以实现,关键是利用对象的key值!思路很重要,当然还要不断的尝试,寻找最优解
(ps: reduce性能与forEach差不多,reduce稍微强一点点,不过reduce写法看起来稍显牛逼)for/forEach/reduce性能对比