一:用双层for循环+push
(双层循环,外层循环元素,内层循环时比较值;如果有相同的值则跳过,不相同则push进数组)
Array.prototype.distinct = function() {
var arr = this,
result = [],
i,
j,
len = arr.length;
for(i = 0; i < len; i++) {
for(j = i + 1; j < len; j++) {
if(arr[i] === arr[j]) {
j = ++i;
}
}
result.push(arr[i]);
}
return result;
}
var arra = [1, 2, 3, 4, 4, 2, 1, 1];
arra.distinct();
console.log(arra.distinct()); //返回[3,4,2,1]
二:利用splice直接在原数组进行操作
(外层循环元素,内层循环时比较值; 值相同时,则删去这个值)
Array.prototype.distinct = function() {
var arr = this,
i,
j,
len = arr.length;
for(i = 0; i < len; i++) {
for(j = i + 1; j < len; j++) {
if(arr[i] == arr[j]) {
arr.splice(j, 1);
len--;
j--;
}
}
}
return arr;
};
var a = [1, 5, 3, 2, 4, 4, 1, 2, 1, 1, 1, ];
var b = a.distinct();
console.log(b.toString()); //1,5,3,2,4
三:利用indexOf以及forEach
Array.prototype.distinct = function() {
var arr = this,
result = [],
len = arr.length;
arr.forEach(function(v, i, arr) { //这里利用map,filter方法也可以实现
var bool = arr.indexOf(v, i + 1); //从传入参数的下一个索引值开始寻找是否存在重复
if(bool === -1) {
result.push(v);
}
})
return result;
};
var a = [ 1, 1, 2, 2, 3, 3, 2, 1];
var b = a.distinct();
console.log(b.toString()); //3,2,1
四:利用ES6的set
function dedupe(array) {
return Array.from(new Set(array));
}
dedupe([1, 1, 2, 3])
let arr = [1, 2, 3, 3];
let resultarr = [...new Set(arr)]; //拓展运算符(...)内部使用for...of循环
console.log(resultarr); //[1,2,3]