javascript 没有原生的Distinct功能 . (至少现在还没有)
但我们可以通过简单的script 自己实现 .
Distinct就是把数组中重复出现2次或以上的值给删除掉,确保数组内每个值都是唯一的 .
我相信大家开始的时候都会和我用同一个方法来处理。
那就是开一个新的数组(空),然后 for loop 旧的数组 ,然后复制进去新的数组里面,每次复制进去的时候先检查一篇新数组内是否有了这个值,有了就跳过,没有才加进去 。
代码 :
var old_array = [1, 2, 3, 3, 4, 5]; //3重复了
var new_array = [];
for (var i = 0; i < old_array.length; i++) {
var value = old_array[i];
var is_exist = false;
for (var j = 0; j < new_array.length; j++) {
if (new_array[j] === old_array[i]) { //检查
is_exist = true;
break;
}
}
if (is_exist) continue;//跳过
new_array.push(old_array[i]); //添加
}
alert(new_array); //[1,2,3,4,5]
有些人可能觉得这样效率不太好,因为for loop 很多次匹配 .
有人就建议使用 object 来替代
代码 :
var u = {}, a = [];
for (var i = 0, l = this.length; i < l; ++i) {
if (u.hasOwnProperty(this[i])) {
continue;
}
a.push(this[i]);
u[this[i]] = 1;
}
return a;
object 走索引,似乎可以快一些,但是这里有个小问题。
就是如果你的数组中有 object ,这样就会造成错误了。(ECMA6好像不会了)
因为object 的属性不能是 object ,只能是 string 和 number .
所以不鼓励使用这个方法,除非你确保你的数组内的值都是 string , number .
总结 :
方法1的文言文写法是这样的 :
代码 :
var old_array = [1, 2, 3, 3, 4, 5]; //3重复了
old_array = old_array.reduce(function (new_array, old_array_value) {
if (new_array.indexOf(old_array_value) == -1) new_array.push(old_array_value);
return new_array; //最终返回的是 prev value 也就是recorder
}, []);
最后把它加入 array的 prototype里面就可以啦
代码 :
Array.prototype.distinct = function () {
return this.reduce(function (new_array, old_array_value) {
if (new_array.indexOf(old_array_value) == -1) new_array.push(old_array_value);
return new_array; //最终返回的是 prev value 也就是recorder
}, []);
}
调用 :
var old_array = [1, 2, 3, 3, 4, 5]; //3重复了
var new_array = old_array.distinct();
Javascript Array Distinct