数组去重总结
起因:项目过程中需要解决一个去重数组的需求。
数组去重方法不一,本文根据去重输出结果的不同,来分类总结出对应的方法,方便应用到各个场景。
去重(无序型)
var arr= [1,2,3,4,3,1,7,2,8,9,1,4,5,6];
function uniqueArray(arr){
var obj = {};
for (var i = 0,len=arr.length; i < len; i += 1) {
obj[arr[i]] = arr[i];
}
return Object.keys(obj);
}
uniqueArray(arr);
输出结果:["1", "2", "3", "4", "5", "6", "7", "8", "9"]
去重(有序型)
var arr= [1,2,3,4,3,1,7,2,8,9,1,4,5,6];
function removeDuplicatedItem(ar) {
var ret = [];
for (var i = 0, j = ar.length; i < j; i++) {
if (ret.indexOf(ar[i]) === -1) {
ret.push(ar[i]);
}
}
return ret;
}
removeDuplicatedItem(arr);
输出结果: [1, 2, 3, 4, 7, 8, 9, 5, 6]
反向去重(重复元素保留的是最后出现的一个,不是第一个)
- 方法一:上述有序型稍作的输入和输出都反向一下即可;
var arr= [1,2,3,4,3,1,7,2,8,9,1,4,5,6];
arr = arr.reverse();//数组先反向
function removeDuplicatedItem(ar) {
var ret = [];
for (var i = 0, j = ar.length; i < j; i++) {
if (ret.indexOf(ar[i]) === -1) {
ret.push(ar[i]);
}
}
return ret;
}
var bb =removeDuplicatedItem(arr);
bb.reverse();//数组结果反向
输出结果: [3, 7, 2, 8, 9, 1, 4, 5, 6]
- 方法二:更改for循环(精髓与方法一相同)
var aa= [1,2,3,4,3,1,7,2,8,9,1,4,5,6];
function unique() {
var result = [], isRepeated;
for (var i = aa.length-1, len = aa.length; i >= 0; i--) {
isRepeated = false;
for (var j = 0, lenj = result.length; j < lenj; j++) {
if (aa[i]== result[j]) {
isRepeated = true;
break;
}
}
if (!isRepeated) {
result.push(aa[i]);
}
}
result.reverse();
}
输出结果:[3, 7, 2, 8, 9, 1, 4, 5, 6]
- 方法三:ES6方法(阿四友情赞助,感谢!)
function filterArray(arr) {
return (Array.from(new Set((arr.slice()).reverse()))).reverse();
}
思路解说:reverse第一次反向,能使数组按照一般的有序型去重方法去处理,reverse第二次反向,使数组输出顺序按照arr数组原来的前后顺序排列展示。slice防止reverse方法对arr数组的值直接操作导致原数组arr的改变。
输入:[1,2,3,4,3,1,7,2,8,9,1,4,5,6]
输出结果:[3, 7, 2, 8, 9, 1, 4, 5, 6]
方法四:结合F7提供的方法,灵活应用(嘉哥友情赞助,赞赞!!)
$.unique(arr.slice().reverse()).reverse()
解说:arr是输入的数组,$是F7的赋值对象,unique是F7的方法
输入:[1,2,3,4,3,1,7,2,8,9,1,4,5,6]
输出结果:[3, 7, 2, 8, 9, 1, 4, 5, 6]
完美 ending!!!!!