聲明:
本文給出的大多數方法都不是原創,在具體方法使用時給出了出處的連接,不過有部分方法實現較簡單不少地方都有,因此未註明,在最後會給出全部的參考連接。文章來自我的博客, 轉載請註明出處。javascript
給定一個數組,裏面有重複的數字,字符串,或者是二維的數組、對象等,將裏面的重複的去除,並返回新數組html
測試數組爲: var arr = [1, 7, 7, 1, '1',3, 5, 3, '3', '5'];
java
方法一
思路:用兩個for循環,相互比較而後去掉重複的數字。
實現:node
var arr = [1, 7, 7, 1, '1',3, 5, 3, '3', '5']; var uniqArray1 = function(arr) { var uniqArr = []; var arrLen = arr.length; for(var i = 0; i < arrLen; i++) { for(var j = i + 1; j < arrLen; j++) { if(arr[i] == arr[j]) { j = ++i; } } uniqArr.push(arr[i]); } return uniqArr; }; console.log(uniqArray1(arr)); //[ 7, '1', '3', '5' ]
方法一容易想到,可是當測試數據不少時,因爲雙重循環會致使性能不好。segmentfault
方法二
思路:新建數組,遍歷原數組,檢測當新數組中不存在原數組中的元素時將其push進去,最後返回新數組
實現:數組
var arr = [1, 7, 7, 1, '1',3, 5, 3, '3', '5']; var uniqArray2 = function(arr) { var newArr = []; for(var i = 0,arrLen = arr.length; i < arrLen; i++) { //indexOf在IE8一下不支持 if(newArr.indexOf(arr[i]) == -1) { newArr.push(arr[i]); } } return newArr; }; console.log(uniqArray2(arr)); //[ 1, 7, '1', 3, 5, '3', '5' ]
比方法一的性能好一些,可是對於須要考慮IE6-8的,須要額外再加點代碼:瀏覽器
//該代碼來自:http://www.cnblogs.com/wteam-xq/p/4732351.html //判斷瀏覽器是否支持indexOf ,indexOf 爲ecmaScript5新方法 IE8如下(包括IE8, IE8只支持部分ecma5)不支持 if (!Array.prototype.indexOf){ // 新增indexOf方法 Array.prototype.indexOf = function(item){ var result = -1, a_item = null; if (this.length == 0){ return result; } for(var i = 0, len = this.length; i < len; i++){ a_item = this[i]; if (a_item === item){ result = i; break; } } return result; } }
方法三
思路:利用sort方法排序,而後比較數組中先後兩個數字是否相同,去掉不相同的返回新數組
實現:app
var arr = [1, 7, 7, 1, '1',3, 5, 3, '3', '5']; var uniqArray3 = function(arr) { arr.sort(); var newArr = [arr[0]]; for(var i = 1, arrLen = arr.length; i < arrLen; i++) { if( arr[i] != newArr[newArr.length- 1]) { newArr.push(arr[i]); } } return newArr; }; console.log(uniqArray3(arr)); //[ 1, 3, 5, 7 ]
一個關於sort方法的小插曲:函數
關於sort方法須要補充一點,若是須要利用sort進行升序或降序排列,爲了實現排序,
sort()方法會調用每一個數組項的toString()轉型方法,而後比較獲得的字符串肯定如何排序,例如:性能
var values = [1,10,5,65,666,223]; values.sort(); console.log(values); //[ 1, 10, 223, 5, 65, 666 ]
即便數組中每一項都是數值,sort()比較的也是字符串,而在比較字符串時"10"位於"5"前面,因而數組的順序就不是預期的了。
sort能夠接受一個比較函數,進而達到咱們預期的比較結果:
function compare(a , b) { if( a < b) { return -1; }else if(a>b) { return 1; }else { return 0; } } var values = [1,10,5,65,666,223]; values.sort(compare); console.log(values); //[ 1, 5, 10, 65, 223, 666 ]
這樣就獲得了升序排列,而想要降序時,只須要在打印時reverse()一下便可。
方法四
思路:利用對象中是否有同樣的屬性進行比較。
實現:
//from:http://blog.jobbole.com/33099/ var arr = [1, 7, 7, 1, '1',3, 5, 3, '3', '5']; var uniqArray4 = function(arr) { var result = []; var hash = {}; var item,key; for(var i = 0, arrLen = arr.length; i < arrLen; i++) { item = arr[i]; //對象的鍵值只能是字符串, key = typeof(item) + item; //區分數值 1 和字符串 '1' 等狀況 if(!hash[key]) { result.push(item); //hash用來反射key是否重複 hash[key] = true; //代表該值存進新數組了 } } return result; }; console.log(uniqArray4(arr)); //[ 1, 7, '1', 3, 5, '3', '5' ]
方法五
思路:利用對象字面量的key和value關聯性,
實現:
//from: https://segmentfault.com/q/1010000000262609 var arr = [1, 7, 7, 1, '1',3, 5, 3, '3', '5']; var uniqArray5 = function(arr) { var obj = {}; var len = arr.length; for(var i = 0; i < len; i++) { obj[arr[i]] = arr[i]; } return Object.keys(obj); }; console.log(uniqArray5(arr)); //[ '1', '3', '5', '7' ]
方法六
思路:利用數組的filter方法
實現:
//from: https://segmentfault.com/q/1010000003864059 var arr = [1, 7, 7, 1, '1',3, 5, 3, '3', '5']; var uniqArray6 = function(arr) { return arr.filter(function (elem, index) { return arr.indexOf(elem) === index; }); }; console.log(uniqArray6(arr)); //[ 1, 7, '1', 3, 5, '3', '5' ]
對於filter()方法的補充:
filter: 對數組中的每個元素調用參數中指定的過濾函數,並將對於過濾函數返回值爲true的那些數組元素集合爲新的數組返回。
方法七
思路:利用數組的filter方法
var arr = [1, 7, 7, 1, '1',3, 5, 3, '3', '5']; var uniqArray8 = arr.filter(function(element, index,array) { return array.indexOf(element) >= index; }); console.log(uniqArray8); //[ 1, 7, '1', 3, 5, '3', '5' ]
方法八
思路:利用數組的filter方法
var arr = [1, 7, 7, 1, '1',3, 5, 3, '3', '5']; var uniqArray9 = arr.filter(function(element, index,array) { return arr.lastIndexOf(element) === index; }); console.log(uniqArray9); //[ 7, 1, '1', 5, 3, '3', '5' ]
方法九
思路:利用reduce方法
var arr = [1, 7, 7, 1, '1',3, 5, 3, '3', '5']; var uniqArray8 = function(a) { return a.reduce(function(p, c) { if (p.indexOf(c) < 0) p.push(c); return p; }, []); }; console.log(uniqArray8(arr)); //[ 1, 7, '1', 3, 5, '3', '5' ]
關於reduce方法的補充:
reduce()方法從數組的第一項開始,在每一項上調用函數,這個函數返回的任何值都會做爲第一個參數自動傳給下一項。
方法十
使用ES6的set方法。
Array.prototype.getUnique = function() { return [...new Set( [this] )]; };
方法十一
使用jQuery
實現:
//from:http://stackoverflow.com/questions/1960473/unique-values-in-an-array (function($){ var _old = $.unique; $.unique = function(arr){ if (!!arr[0].nodeType){ return _old.apply(this,arguments); } else { return $.grep(arr,function(v,k){ return $.inArray(v,arr) === k; }); } }; })(jQuery); var arr = ['first',7,true,2,7,true,'last','last']; $.unique(arr); // ["first", 7, true, 2, "last"] var arr = [1,2,3,4,5,4,3,2,1]; $.unique(arr); // [1, 2, 3, 4, 5]
思路:經過isArray方法判斷數組中是否還有數組,若是有數組,在該數組上再次遍歷
實現:
//from: https://segmentfault.com/q/1010000000444289 var arr = [1,2,3,[1,1,2],[3,2],2]; var uniqArray11 = function(arr) { var result = arr.reduce(function(v, i) { //判斷有沒有二維數組 if(Array.isArray(i)) { i.forEach(function(item) { if(v.indexOf(item) < 0) { v.push(item); } }); }else if(v.indexOf(i) < 0){ v.push(i); } return v; }, []); return result; }; console.log(uniqArray11(arr)); //[ 1, 2, 3 ]
實現:
//from:http://stackoverflow.com/questions/1960473/unique-values-in-an-array Array.prototype.getUnique = function() { var hash = {}, result = [], key; for ( var i = 0, l = this.length; i < l; ++i ) { key = JSON.stringify(this[i]); if ( !hash.hasOwnProperty(key) ) { hash[key] = true; result.push(this[i]); } } return result; }; var data = [ { name: "aaa", value: 123 }, { name: "bbb", value: 234 }, { name: "aaa", value: 123 }, { name: "bbb", value: 789 } ]; console.log(data.getUnique()); //[ { name: 'aaa', value: 123 }, // { name: 'bbb', value: 234 }, // { name: 'bbb', value: 789 } ]
下面是本文所述方法的來源連接:
http://www.cnblogs.com/wteam-xq/p/4732351.html
http://blog.jobbole.com/33099/
https://segmentfault.com/q/1010000000262609
https://segmentfault.com/q/1010000003864059
https://segmentfault.com/q/1010000000444289
http://stackoverflow.com/questions/1960473/unique-values-in-an-array
http://stackoverflow.com/questions/11246758/how-to-get-unique-values-in-an-array