有时候我们需要将对象数组根据某个相同字段进行分组,下面就是我自己写的方法,亲测有效。
完整代码:(将 id 相同的数据分在同一组)
let dataArr = [
{id: 1, value: '值1'},
{id: 2, value: '值2'},
{id: 3, value: '值3'},
{id: 1, value: '值4'},
{id: 2, value: '值5'},
];
function classify(arr){
let map = {};
let myArr = [];
for(let i = 0; i < arr.length; i++){
if(!map[arr[i].id]){
myArr.push({
id: arr[i].id,
data: [arr[i]]
});
map[arr[i].id] = arr[i]
} else {
for(let j = 0; j < myArr.length; j++){
if(arr[i].id === myArr[j].id){
myArr[j].data.push(arr[i]);
break
}
}
}
}
return myArr
}
console.log(classify(dataArr))
打印结果:
说明:首先用一个 map 对象来存储相同字段,用一个 myArr 数组来存储返回数组;
再循环遍历原数组,检测 map 对象中是否包含相同字段(id,以下全用id)。map 对象中没有 id 这个字段,则将当前循环对象push 到 myArr 中,并且给 map 对象赋予 id 这个值。
如果检测到 map 对象中有 id 这个字段,则再次循环遍历 myArr 数组,如果当前原数组遍历对象的 id 和 myArr 数组遍历的 id 相同,则将当前遍历的原数组对象 push 到对应的 myArr 数组里面。
最后的打印的结果见上图