JS数组去重

let arr = [{a:1,b:1,c:1,d:1,e:1},{a:1,b:1,c:1,d:2,e:2},{a:2,b:2,c:2,d:1,e:1}]
我想要abc值相同的保留一个,同时abc值相同的d相加
所以应该变成
arr1=[{a:1,b:1,c:1,d:3,e:1},{a:2,b:2,c:2,d:1,e:1}]

用到了数组的splice(index,endlength,item)方法,删除数组中的项,里面可以有三个参数

注意 会改变原数组

返回值  删除的项组成的新数组

代码如下:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title></title>

</head>

<body>

<script type="text/javascript">

var arr = [{a:1,b:1,c:1,d:1,e:1},{a:1,b:1,c:1,d:2,e:2},{a:2,b:2,c:2,d:1,e:1}];

//循环开始

for(var i=0;i<arr.length-1;i++){

//遍历数组中a b c 都一样的才往下进行

if((arr[i].a == arr[i+1].a) && (arr[i].b == arr[i+1].b) && (arr[i].c == arr[i+1].c)){

//删除重复的那一个元素,改变了数组

arr.splice(i,1);

//d的值累加

arr[i].d += arr[i+1].d;

console.log(arr)

}

}

</script>

</body>

</html>

追问

当我三个对象相同时,得出的结果跟我想要的就不一样了

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-08-23
for(int i=0;i<arr.length-1;i++){
for(int j=i+1;j<arr.length;j++){
if(arr[i].a==arr[j].a && arr[i].b==arr[j].b && arr[i].c==arr[j].c){
arr[i].d+=arr[j].d;
arr.splice(j,1);
j--;
}
}
}
试试可以不追问

那我要e值相同的对象不能相加并且只留下d值最大的那个 应该怎么做呢?

追答

那就比较e 如果相同就判断当前d的值是否小于比较的成员 如果是就 就交换一下成员 然后删除小的 如果不小于则直接删除比较的成员

追问

能提供下代码吗 我试了下 做不出来

追答

for(int i=0;i<arr.length-1;i++){
for(int j=i+1;j<arr.length;j++){
if(arr[i].e==arr[j].e ){
if(arr[i].d<arr[j],d){
arr[i]=arr[j];
}
arr.splice(j,1);
j--;
}
}
}

追问

可能我说的不大清楚,我的意思是说在原有的abc值相同的保留一个,同时abc值相同的d相加 这个条件下 再加一个e值相同的对象不能相加并且只留下d值最大的那个 这个条件

追答

for(int i=0;i<arr.length-1;i++){
for(int j=i+1;j<arr.length;j++){
if(arr[i].a==arr[j].a && arr[i].b==arr[j].b && arr[i].c==arr[j].c){
if(arr[i].e==arr[j].e ){
if(arr[i].d<arr[j],d){
arr[i]=arr[j];
}
}
else arr[i].d+=arr[j].d;
arr.splice(j,1);
j--;
}
}
}

追问

最开始的问题能不能不改变原数组的情况下,去做一个rolls的相加呢

追答

不改原数组 你rolls是什么?

本回答被提问者采纳
相似回答