现有数组persons,数组中的对象有name一样,但是id和age不同的,说明是不同的人,现在的问题就是将相同名字的人归并到同一对象下一个属性中
let persons = [
{id: "1",name: "小明",age: "21"},
{id: "2",name: "小红",age: "22"},
{id: "3",name: "小刚",age: "23"},
{id: "4",name: "小明",age: "24"},
{id: "5",name: "小刚",age: "25"},
]
先执行去重操作,newArr用来保存去重后的新数组,tArr做为一个标记
function unique(arr,type){
let newArr = [];
let tArr = [];
// 先判断数组是否存在
if(arr.length == 0){
return arr;
}else{
if(type){
// 遍历我们要去重的数组
for(let i=0;i<arr.length;i++){
// 执行if时,说明新数组newArr中还没有保存这个值
if(!tArr[arr[i][type]]){
// 将值保存到新数组中
newArr.push({
name: arr[i].name,
arr: []
})
// 添加标记,标记tArr[arr[i][type]]这个值为true,说明已经保存在新数组中,下次再遇到相同的tArr[arr[i][type]]会执行上面的else流程,即什么都不执行
tArr[arr[i][type]] = true;
}
}
return newArr;
}else{
// 说明同上
for(let i=0;i<arr.length;i++){
if(!tArr[arr[i]]){
newArr.push({
name: arr[i].name,
arr: []
})
tArr[arr[i]] = true;
}
}
console.log(newArr)
return newArr
}
}
}
这是我们就已经得到了去重后的结果
newArr = [
{name:"小明",arr: []},
{name:"小红",arr: []},
{name:"小刚",arr: []},
]
接着我们将具有相同name的对象合并
function concatArr(arr){
// 遍历新数组
for(let i=0;i<arr.length;i++){
// 遍历旧数组
for(let j=0;j<persons.length;j++){
// 判断新数组的name是否与旧数组的name相同,相同则将旧数组添加到新数组的arr属性中
if(arr[i].name == persons[j].name){
arr[i].arr.push(persons[j]);
}
}
}
return arr;
}
执行函数去重和合并函数
function aa(){
let uniqueResult = unique(persons,"name");
let concatArrResult = concatArr(uniqueResult);
}
aa();
最后得到的去重合并后的数组
concatArrResult = [
{name:"小明",arr:[{age: "21",id: "1",name: "小明"},{age: "24",id: "4",name: "小明"}]},
{name:"小红",arr:[{age: "22",id: "2",name: "小红"}]},
{name:"小刚",arr:[{age: "23",id: "3",name: "小刚"},{age: "25",id: "5",name: "小刚"}]},
]
附上完整代码
var persons = [
{id: "1",name: "小明",age: "21"},
{id: "2",name: "小红",age: "22"},
{id: "3",name: "小刚",age: "23"},
{id: "4",name: "小明",age: "24"},
{id: "5",name: "小刚",age: "25"},
];
function unique(arr,type){
let newArr = [];
let tArr = [];
if(arr.length == 0){
return arr;
}else{
if(type){
for(let i=0;i<arr.length;i++){
if(!tArr[arr[i][type]]){
newArr.push({
name: arr[i].name,
arr: []
})
tArr[arr[i][type]] = true;
}
}
return newArr;
}else{
for(let i=0;i<arr.length;i++){
if(!tArr[arr[i]]){
newArr.push({
name: arr[i].name,
arr: []
})
tArr[arr[i]] = true;
}
}
return newArr
}
}
}
function concatArr(arr){
for(let i=0;i<arr.length;i++){
for(let j=0;j<persons.length;j++){
if(arr[i].name == persons[j].name){
arr[i].arr.push(persons[j]);
}
}
}
return arr
}
function aa(){
let uniqueResult = unique(persons,"name");
let concatArrResult = concatArr(uniqueResult);
console.log(concatArrResult)
}
aa();