js中常见的去重方式

/*
* 几种常用的去重的方式
*/

var arr = [2, 6, 1, 15, 11, 7, 12, 8, 5, 4, 3, 12, 10, 1, 7, 2, 4, 4, '4', 12, false, false, 3, '3'];

// 去重方法1 : 先将数组排序,然后循环数组,判断当前元素与上一个是否相当,只针对number

var unique1 = function(arr) {

var removeArr = [];
arr = arr.sort((function(a, b){ return a - b;}));
for (var i=1; i<arr.length;i++) {
if (arr[i] === arr[i-1] ) {
arr.splice(i--,1);
}
}
return arr;
};

// 去重方法2:排序后,利用新数组内.push的元素比较2个值是否相等。只针对number

var unique2 = function(arr) {
arr = arr.sort(function(a, b){return a - b;});
var result = [arr[0]],
len = arr.length,
i;

// 每次与新增到result中的值对比
for(i = 1; i < len; i++) {
if(arr[i] !== result[result.length - 1]) {
result.push(arr[i]);
}
}

return result;

};

// 去重方法3:利用对象中是否有一样的属性进行比较。可区分string和number

var unique3 = function(arr) {
var result = [], 
o = {},
len = arr.length,
i;

for(i = 0; i < len; i++) {
if(!o[arr[i]]) {
result.push(arr[i]);
o[arr[i]] = true;
}
}

return result;
};

// 去重方法4:类似于插入排序~不过是从前向后找。只针对number类型
var unique4 = function(arr) {
var i, j;

for(i = 0; i < arr.length; i++) {
j = i + 1; // 相邻比较
while(j < arr.length){
if(arr[i] === arr[j]) {
arr.splice(j, 1);
j--; // 删除后,当前索引值则会是自动补进下一位元素,因此要--,否则会跳过自动补进的元素
}
j++; // 向后查找
}
} 
return arr.sort(function(a,b){return a - b;});
};

// 去重方法5:跳出循环 向后查找比较当前i的值
var unique5 = function(arr) {
var result = [], len = arr.length, i, j;
for(i = 0; i < len; i++) {
for(j = i + 1; j < len; j++) {
if(arr[i] === arr[j]) { // 如果有相同的j重新赋值false并跳出loop
j = false;
break;
}
}
if(j) { // j为false时,当前i的值不计入新数组内,直到是唯一的才会被push进去。
result.push(arr[i]);
}
}

return result.sort(function(a, b){return a - b;});
};

// 去重方法6:向后查找,如果值相等,则跳出本次循环,进行下次循环
var unique6 = function(arr) {
var result = [], len = arr.length, i, j;
for(i = 0; i < len; i++) {
j = i + 1;
while(j < len){
if(arr[i] === arr[j]){
j = ++i; // 跳出本次循环
}
j++;
}
result.push(arr[i]);
}

return result.sort(function(a, b){return a - b;});
};

// console.log(unique1(arr));
// console.log(unique2(arr));
// console.log(unique3(arr));
// console.log(unique4(arr));
// console.log(unique5(arr));
console.log(unique6(arr));

 

posted @ 2015-09-27 09:52  阿司★*^_^*联波  阅读(277)  评论(0编辑  收藏  举报