“如果你一直在乎别人的看法,你就毁了。” ——《荒蛮故事》。
看了realazy的《JavaScript 数组的uniq方法》,提供了几个删除数组条目中重复的条目的Array原型方法,我也给出我的新解:
1、Realazy的写法
Array.prototype.uniq = function() {
var resultArr = [],
returnArr = [],
origLen = this.length,
resultLen;
function include(arr, value) {
for (var i = 0, n = arr.length; i < n; ++i){
if (arr[i] === value) {
return true;
}
}
return false;
}
resultArr.push(this[0]);
for (var i = 1; i < origLen; ++i) {
if (include(resultArr, this[i])) {
returnArr.push(this[i]);
} else {
resultArr.push(this[i]);
}
}
resultLen = resultArr.length;
this.length = resultLen;
for (var i = 0; i < resultLen; ++i){
this[i] = resultArr[i];
}
return returnArr;
}
我稍作修改,避免返回的重复项数组中存在重复项,但思路不变。
Array.prototype.distinct = function(){
var ret = [],
resultArr = [],
returnArr = [],
i = 1,
origLen = this.length,
resultLen;
function include(arr, value){
for (var i=0, n=arr.length; i<n; ++i){
if (arr[i] === value){
return true;
}
}
return false;
}
resultArr.push(this[0]);
for (i; i<origLen; ++i){
if (!include(resultArr, this[i])){
resultArr.push(this[i]);
} else {
if (!include(returnArr, this[i])){
returnArr.push(this[i]);
}
}
}
ret[0] = resultArr;
ret[1] = returnArr;
return ret;
}
2、能叔的写法
直接返回一个包含2个元素的数组,一个是删除重复项的新数组,一个是包含重复项的数组。
经测试这个方法比realazy给出的方法似乎还要快一些。
Array.prototype.distinct = function()
{
var ret = [],
resultArr = [],
returnArr = [];
var a = {};
for(var i=0; i<this.length; i++) {
if(typeof a[this[i]] == "undefined") {
a[this[i]] = false; //数组中只有一项
}
else{
a[this[i]] = true; //数组中有重复的项
}
}
for(var i in a) {
resultArr[resultArr.length] = i;
if (a[i]) {
returnArr[returnArr.length] = i;
}
}
ret[0] = resultArr;
ret[1] = returnArr;
return ret;
}
3、其它写法
当然还有很多其它的写法,主要借助于Array原生方法:
-
利用splice函数:
Array.prototype.distinct_bt1 = function() { var ret = []; for (var i = 0; i < this.length; i++) { for (var j = i+1; j < this.length;) { if (this[i] === this[j]) { ret.push(this.splice(j, 1)[0]); } else { j++; } } } return ret; }
-
利用sort函数:
Array.prototype.distinct_bt2=function(){ this.sort(); var ret = []; for(var i=this.length-1;i>-1;i--) { if( this[i] != ret[ ret.length - 1 ] ) ret.push(this[i]); } return ret; }
缺点也很明显:
- distinct_bt1返回的重复项数组中存在重复项,而且执行效率不高。
- distinct_bt2对元数组进行了排序,似乎有点画蛇添足(破坏了数组的原始排序属性),但想法不错O(∩_∩)O~
欢迎关注我的个人微信公众号:能叔