首先先來一種簡單粗暴的方法
也是很容易就可以想到的辦法
宣告乙個新陣列
直接遍歷這個待去重陣列
然後把新陣列中沒有的元素推進去
function unique(arr)
} return newarr;
};
測試陣列
var arr = [1,3,2,1,4,5,2,4,1,5];
console.log(unique(arr)); //[1,3,2,4,5]
這個結果是正確的
但是如果元素中有undefined或者null就會出現問題
var arr = [1,3,2,1,null,4,5,2,4,1,5,null];
console.log(unique(arr)); //[1,3,2]
這是因為for(var i = 0, item; item = arr[i++];)
null導致提前跳出了循壞
沒辦法雖然我很喜歡這種迴圈方式
但是為了保持嚴謹還是要使用正常的for迴圈
function unique(arr)
} return newarr;
};var arr = [1,3,2,1,null,4,5,2,4,1,5,null];
console.log(unique(arr)); //[1,3,2,null,4,5]
當然也可以使用es5的foreach方法
雖然它沒有for迴圈的效率高
function unique(arr)
});return newarr;
}
下面的其他方法也可以把for迴圈替換成foreach
除此之外,我們還可以使用es5的reduce方法
讓**看起來更加高大上
function unique(arr)
return prev;
}, );
}
indexof也可以替換成迴圈判斷
不過既然有好使的api就直接拿來用了
順便一提,方法不能夠處理陣列nan的去重
var arr = [4, 2, 1, 3, 2, 3, nan, nan];
console.log(unique(arr)); //[4,2,1,3,nan,nan]
包括下面的方法都不可以
不過可以把indexof()換成es6的array.contains()
真正意義上的絕對相等
這裡我就不討論太複雜的情況了
這種方法是利用了陣列indexof的特點
它會找到陣列中第乙個該元素值的索引
所以我們可以判斷陣列元素的indexof索引判斷和元素本身的索引是否相同
如果相同,代表這是陣列第一次出現的該元素值
function unique(arr)
} return newarr;
}
我們還可以做一些小小的優化
因為實際上第一次是不需要判斷的
陣列元素的第乙個值一定是首次出現的
所以從陣列的第二個元素開始迴圈就可以了
function unique(arr)
} return newarr;
}
這種方法的原理就是首先呼叫陣列的sort方法
我們的目的不是給陣列元素排序
所以也不需要為sort新增處理函式
目的是為了把相同的元素值聚在一起
這樣只需要判斷陣列元素值和上乙個索引值不同就可以了
function unique(arr)
} return newarr;
}
這種方法看起來特別夢幻
原理是不斷的將陣列最右邊不重複的值推入新陣列
function unique(arr)
}newarr.push(arr[i]);
} return newarr;
};
說的再詳細一下
就是對陣列的每乙個元素都進行判斷(指標i)
還有另乙個指標從判斷元素的下一位進行判斷
移動這個指標(指標j下移)
如果發現判斷元素與指標指向的值相等
證明該判斷元素不是陣列中唯一的
那麼就繼續往下判斷(指標i下移,指標j回到i的下一位)
直到j移到陣列終點
證明判斷元素(指標i指向的元素)是陣列中唯一的
推入新陣列
這種方法是很好的一種方法
借用了乙個臨時物件的資料結構
這個物件用來儲存陣列的元素
function unique(arr);
var item;
for(var i = 0, len = arr.length; i < len; i++)
} return newarr;
}
這是典型的空間換取時間思想的演算法
如果陣列很大可能會很佔記憶體
但是效率很高這是毋庸置疑的
其實現在這個函式還是有缺點
var arr = [1,3,2,1,4,5,2,4,1,5,'1','2'];
console.log(unique(arr)); //[1,3,2,4,5]
從這個測試中可以看到陣列和字元沒能有效區分
這是因為它們傳入物件中會呼叫tostring()
物件的鍵都是字串
既然這樣我們可以對函式做一些修改
讓物件的鍵對應乙個陣列
陣列儲存著已有的型別
function unique(arr);
var item;
var type;
for(var i = 0, len = arr.length; i < len; i++)else if(temp[item].indexof(type) === -1)
} return newarr;
}
這樣記憶體占用更大了
但是卻更加嚴謹了
var arr = [1,3,2,1,4,5,2,4,1,5,'1','2'];
console.log(unique(arr)); //[1,3,2,4,5,"1","2"]
集合這個資料結構最大的特點就是
集合內部的元素都是唯一的
es6標準給我們提供了set集合
利用這個新的資料結構我們可以很容易的實現陣列去重
容易到什麼程度呢?
一行..
就夠了
function unique(arr)
這才是真正的簡單粗暴
將陣列轉為集合,拋棄多餘數值
最後利用es6的新陣列方法array.from將集合轉為陣列返回
function unique(arr)
關於陣列的去重
簡單一維陣列的去重方法有很多,這種陣列裡面的值都是普通的資料型別,並沒有物件,因此去重方法有很多,這裡總結一下常用的四種方法 網上還有一些其它的方法 方法一 雙層迴圈去重 function uniquearr arr result.push arr i return result 方法二 利用物件的...
JS陣列去重,物件去重
例項1根據indexof去重,indexof的好處就是返回的是首次出現的位置,這樣後面即使出現的值一樣,也只能返回第一次出現的索引,當然這個只適用於簡單的陣列 物件陣列去重 const objarr const obj const newobjarr for let i 0 i objarr.len...
關於陣列的那些事 陣列去重
陣列去重的方法很多,我在這裡整理了其中一種方法,並且就著例子介紹了下其中的思路。1.陣列去重的js 如下 var arr1 5,16,4,1,5,14,16 var arr2 for var i 0 i console.log arr2 2.關於陣列去重,我使用的是js的indexof 這個方法 i...