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();
這里順便提一下 reduce 方法
function(prev,now,index,array) { return prev; }
當index=0時,prev就是我們第一次傳入reduce方法的第2個參數 (reduce(fn, 這個值 <--))
接着循環時 now 就是 array 內的值
每次return的值是下一次循環的 prev 值 , 所以最后我們得到的就是prev.