简单的数组去重是比较简单的, 方法也特别多, 如给下面的数组去重:
let arr = [1,2,2,4,9,6,7,5,2,3,5,6,5]
最常用的可以用 for 循环套 for 循环, 再用 splice 删除重复的数组:
- let arrUnique = function (arr){
- for(let i=0; i<arr.length; i++){
- for(let j=i+1; j<arr.length; j++){
- if(arr[i]==arr[j]){ // 第一个等同于第二个, splice 方法删除第二个
- arr.splice(j,1);
- j--;
- }
- }
- }
- return arr;
- }
然而数组的子集为对象时, 一般不使用多个 for 循环来去重, 如下面的数组对象:
- let arr = [
- {
- mch_id:'ghx1',
- status: 1,
- type: 2
- },
- {
- mch_id:'awx2',
- status: 2,
- type: 3
- },
- {
- mch_id:'ghx1',
- status: 1,
- type: 2
- },
- {
- status: 1,
- type: 2,
- mch_id:'ghx1'
- }
- ]
通过观察, 我们可以发现该数组中的第 1,3,4 项其实是一样的, 最初在谷歌找了几个方法最终都不太满意, 比如会改变数组中对象原来的排序, 数组去重失败等, 后来经过多次尝试和实践, 得出以下最简单的方法:
利用对象的键名无法重复的特点, 我们可以新建一个临时对象来存储原数组中的对象子集的值, 比如我的项目中 mch_id 是唯一的 ID, 然后设置的它为临时对象的键名, 值为 true 即可, 保证它的唯一性
通过判断对象的键名是唯一时, 把对应的数组值添加到一个空数组中, 最终得到一个去重后的数组对象
此方法不会改变数组对象原有的排序
- let arrUnique = function(arr){
- let result = {};
- let finalResult=[];
- for(let i=0;i<arr.length;i++){
- // 利用对象的键名无法重复的特点, cpmch_id 是唯一区别的属性值
- result[arr[i].mch_id] ? '' : result[arr[i].mch_id] = true && finalResult.push(arr[i]);
- }
- return finalResult;
- }
或者利用 ES5 数组方法 reduce
- let arrUnique = function(arr){
- let ojb = {};
- arr = arr.reduce(function(prevArr, currentItem) {
- // 利用对象的键名无法重复的特点, mch_id 是唯一区别的属性值
- ojb[currentItem.mch_id] ? '' : ojb[currentItem.mch_id] = true && prevArr.push(currentItem);
- return prevArr
- }, [])
- return arr;
- }
提前祝大家劳动节快乐
来源: https://www.cnblogs.com/PeunZhang/p/10773351.html