用filter方法去除对象数组的重复项
最编程
2024-02-02 08:24:49
...
正常利用filter
去重
var arr = [1, 2, 2, 3, 4, 5, 5, 6, 7, 7,8,8,0,8,6,3,4,56,2];
var arr2 = arr.filter((item, index,self)=>{
return self.indexOf(item)===index
})
console.log(arr2); // [1, 2, 3, 4, 5, 6, 7, 8, 0, 56]
此方法判断去重机制:在filter
中定义了一个匿名函数,在filter
方法中,会遍历目标数组,对于数组中的每个元素,都会被自己定义的那个匿名函数执行一次,每一次返回一个boolean值,如果返回false,则会将该元素从数组中去除,最后filter
方法会返回一个新的数组对象作为处理结果。
这种方式的局限性:由于里面的判断相等,用的是indexOf(item)
获取当前元素出现的第一次出现的位置,再判断该位置是否与当前元素下标相等,如果不相等,说明在其他位置出现的相同的值,就返回false,这种方式只能用于简单元素的数组,不能用于判断对象。
给对象去重
var arr = [
{'id':1,'name':'fsdf'},
{'id':1,'name':'fsdf'},
{'id':2,'name':'fsdf'},
{'id':2,'name':'fsdf'},
{'id':3,'name':'fsdf'},
];
var arr2 = arr.filter((x, index,self)=>{
var arrids = []
arr.forEach((item,i) => {
arrids.push(item.id)
})
return arrids.indexOf(x.id) === index
})
console.log(arr2);
实现原理:: 这个是去除有相同id的对象,首先将每个元素的id单独取出来,给放到一个新的数组中,然后再利用上面的方式进行判断去重 同样有缺陷:只能用于判断对象数组中的对象的某个属性是否重复
进一步的优化(某对象中要判断多个字段同时重复)
var arr = [
{'id':1,'name':'fsdfwsd',},
{'id':1,'name':'fsdfwsd',},
{'id':1,'name':'ythrg'},
{'id':2,'name':'trhwfre'},
{'id':2,'name':'lokfjks'},
{'id':2,'name':'trhwfre'},
{'id':3,'name':'trewtw'},
];
var arr2 = arr.filter((x, index,self)=>{
var arrids = []
var arrnames = []
arr.forEach((item,i) => {
arrids.push(item.id)
arrnames.push(item.name)
})
var judgeOne = arrids.indexOf(x.id) === index
var judgeTwo = arrnames.indexOf(x.name) === index
return judgeOne || judgeTwo
})
console.log(arr2);
实现方式:如果要判断多个对象中的字段,可以继续使用上面的方式,将要判断的其他字段加入同样存入数组中,最后对多个数组进行判断,最后只要有一个为false就为返回false
原文链接:blog.****.net/juststartno…
上一篇: 掌握JavaScript的from方法
下一篇: js数组对象去重
推荐阅读
-
MAX_LEN) {
int pivot = partition(arr, left, right);
quicksort_optimized(arr, left, pivot - 1);
quicksort_optimized(arr, pivot + 1, right);
} else {
// 使用插入排序处理小数组
}
}
```
- 合并相同值进行分割:在每次划分后,我们将与枢轴相等的元素聚集在一起,以降低后续迭代中的重复处理。例如:
原序列: 1 4 6 7 6 6 7 6 8 6
- 选取枢轴(6)并划分:1 4 6 7 1 6 7 6 8 6
- 划分结果(未处理相等项):1 4 6 6 7 6 7 6 8 6
- 处理相等项后的划分结果:1 4 6 6 6 6 7 8 7
- 下次划分得到的子序列:1 4 和 7 8 7
通过这样的优化,我们可以明显减少迭代次数,从而提高排序效率。">
改进版快速排序:针对部分有序列的策略与优化技巧" - 随机选枢轴:当数据部分有序时,传统快速排序通过固定枢轴可能导致效率低下。为此,我们采用随机选取枢轴的方法,代码如下: ```c int SelectPivotRandom(int arr[], int low, int high) { srand(time(0)); int pivotPos = (rand() % (high - low)) + low; swap(arr[pivotPos], arr[low]); return arr[low]; } ``` - 优化小数组交换:针对小且部分有序的数组,快速排序不如插入排序高效。因此,当待排序序列长度小于等于10时,我们会切换至插入排序: ```c #define MAX_LEN 10 void quicksort_optimized(int *arr, int left, int right) { int length = right - left; if (length > MAX_LEN) { int pivot = partition(arr, left, right); quicksort_optimized(arr, left, pivot - 1); quicksort_optimized(arr, pivot + 1, right); } else { // 使用插入排序处理小数组 } } ``` - 合并相同值进行分割:在每次划分后,我们将与枢轴相等的元素聚集在一起,以降低后续迭代中的重复处理。例如: 原序列: 1 4 6 7 6 6 7 6 8 6 - 选取枢轴(6)并划分:1 4 6 7 1 6 7 6 8 6 - 划分结果(未处理相等项):1 4 6 6 7 6 7 6 8 6 - 处理相等项后的划分结果:1 4 6 6 6 6 7 8 7 - 下次划分得到的子序列:1 4 和 7 8 7 通过这样的优化,我们可以明显减少迭代次数,从而提高排序效率。
-
用JavaScript从数组对象中提取一个属性并创建新数组的方法
-
三种有效去除数组中重复对象的方法
-
九招搞定!JS中去除数组重复元素的方法大汇总
-
去除数组中的重复项:基于对象属性的筛选与删除
-
去除数组中的重复项:无论是简单元素还是复杂对象
-
使用JavaScript删除对象数组中的重复项,基于特定字段
-
搞定!这里有6种快速去除对象数组重复项的技巧
-
在JavaScript中删除数组重复项的方法
-
去除JavaScript数组中重复的对象元素的方法