es6方法:
普通數組:
1.使用Array.from(new Set(arr));
/* * @param oldArr 帶有重復項的舊數組 * @param newArr 去除重復項之后的新數組 * */ let oldArr = [1, 1, 1, 2, 3, 2, 4, 4, 4, 9, 9, 0, 0, NaN, NaN]; let newArr = Array.from(new Set(oldArr)); console.log(newArr); // [1, 2, 3, 4, 9, 0, NaN]
解釋:
Set對象
Set對象允許存儲任何類型的唯一值,無論是原始值或者是對象引用。它可以是任何類型的單個值的集合。Set中的元素只會出現一次,即Set中的元素是唯一的。語法:new Set([iterable]);
參數:iterable,如果傳遞一個可迭代對象(包括 Array,Map,Set,String,TypedArray,arguments 對象等等),它的所有元素將被添加到新的 Set中。如果不指定此參數或其值為null,則新的Set為空。
let testArr = [0, 1, 1, 2, 3, 3, 3, 3, 4, NaN, NaN, undefined, undefined]; let setTestArr = new Set(testArr); console.log(setTestArr); // Set(7) {0,1, 2, 3, 4, NaN, undefined}
from對象
Array.from()方法從一個類似數組或可迭代的對象(包括 Array,Map,Set,String,TypedArray,arguments 對象等等) 中創建一個新的數組實例。
let testArr = [1, 1, 2, 3, 3, 3, 3, 4, NaN, NaN, undefined, undefined]; let setTestArr = new Set(testArr); console.log(setTestArr); // {1, 2, 3, 4, NaN, undefined} let newArr = Array.from(setTestArr); console.log(newArr); // [1, 2, 3, 4, NaN, undefined]
es6以前:
方法一:
先排序,后比較, 缺點:得到了排序后的數組,打亂原有的順序
/** * @param {number[]} nums * @return {number} */ var removeDuplicates = function(nums) { nums.sort() for(var i=0;i<nums.length;i++){ if(nums[i]===nums[i+1]){ nums.splice(i,1) i=i-1; } } };
方法二:
雙層循環,外層循環元素,內層循環時比較值
如果有相同的值則跳過,不相同則push進數組
Array.prototype.distinct = function(){ var arr = this, result = [], i, j, len = arr.length; for(i = 0; i < len; i++){ for(j = i + 1; j < len; j++){ if(arr[i] === arr[j]){ j = ++i; } } result.push(arr[i]); } return result; } var arra = [1,2,3,4,4,1,1,2,1,1,1]; arra.distinct(); //返回[3,4,2,1]
方法三:利用splice直接在原數組進行操作
雙層循環,外層循環元素,內層循環時比較值
值相同時,則刪去這個值
注意點:刪除元素之后,需要將數組的長度也減1.
Array.prototype.distinct = function (){ var arr = this, i, j, len = arr.length; for(i = 0; i < len; i++){ for(j = i + 1; j < len; j++){ if(arr[i] == arr[j]){ arr.splice(j,1); len--; j--; } } } return arr; }; var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,]; var b = a.distinct(); console.log(b.toString()); //1,2,3,4,5,6,56
方法四:利用indexOf以及forEach
Array.prototype.distinct = function (){ var arr = this, result = [], len = arr.length; arr.forEach(function(v, i ,arr){ //這里利用map,filter方法也可以實現 var bool = arr.indexOf(v,i+1); //從傳入參數的下一個索引值開始尋找是否存在重復 if(bool === -1){ result.push(v); } }) return result; }; var a = [1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,2,3,3,2,2,1,23,1,23,2,3,2,3,2,3]; var b = a.distinct(); console.log(b.toString()); //1,23,2,3
數組對象去重-----多個數組對象比較可以先利用concat合並
方法三:利用對象的屬性不能相同的特點進行去重-----適用於數組對象
Array.prototype.distinct = function (){ var arr = this, i, obj = {}, result = [], len = arr.length; for(i = 0; i< arr.length; i++){ if(!obj[arr[i]]){ //如果能查找到,證明數組元素重復了 obj[arr[i]] = 1; result.push(arr[i]); } } return result; }; var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,]; var b = a.distinct(); console.log(b.toString()); //1,2,3,4,5,6,56
參考:
https://www.jb51.net/article/118657.htm
https://itpoet.cn/2018/01/17/es6-array-eliminate-redundancy/#more