方法一:
思路:双层循环,外层循环元素内层循环比较值,如果有相同的就跳过,没有相同的就push。
function distinct(arr) {
var newArray = [];
for(var i=0;i<arr.length;i++){
for(var j=i+1;j<arr.length;j++){
if(arr[i] === arr[j])
j = ++i;//核心代码
}
newArray.push(arr[i]);
}
return newArray;
}
var arr = [1,1,2,2,3,4]
var arr1 = [1,1,2,2,1,4]
console.log(distinct(arr));//[1,2,3,4]
console.log(distinct(arr1));//[2,1,4]
上面算法的核心代码是 “ j = ++i ”,在内层循环中直接跳过此轮比较的方法就是++i,但是为什么要将++i赋值给j呢,这是因为如上代码中arr1数组中1重复的方式:相隔数个数字又会存在重复,在内层循环中,j的值已经递增,再进行下一轮,此时中间相隔的部分就没有进行比较,下面来看一下代码:
function distinct(arr) {
var newArray = [];
for(var i=0;i<arr.length;i++){
for(var j=i+1;j<arr.length;j++){
if(arr[i] === arr[j])
++i;//核心代码
}
newArray.push(arr[i]);
}
return newArray;
}
var arr1 = [1,1,2,2,1,4]
console.log(distinct(arr1));//[2,2,1,4]
就像这样会漏掉了一部分比较;
综上,我总结一下对“跳过此轮”的理解:i直接进入下一轮循环,j要紧跟在i的后面,所以 j = ++i;继续循环j就会自增
方法二
思路:利用对象的key值得唯一性,来去重,得到得是新得不重复得数组
function distinct(arr) {
var o = {};
var new_array = [];
for (var i = 0; i < arr.length; i++) {
var k = arr[i];
if (!o[k]){
o[k] = true;
//给o对象加一个新属性,当遇到重复得时候if里得判断条件就会变成false
new_array.push(k);
}
}
return new_array;
}
var arr = [1, 1, 2, 2, 1, 3, 4];
console.log(distinct(arr));//[1,2,3,4]
方法三:双层循环,内层比较,遇到相等的就删除;
Array.prototype.distinct = function(){
var arr = this, //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--;//j也要减少
}
}
}
return arr;
}
var a = [1,1,2,2,3,1,2,4,5,6,4,2,4];
var b = a.distinct();
console.log(b);