陣列去重是非常經典的問題了,不同的實現方法,效能要求差別非常大。
假設有這樣的陣列
去掉重複的項,只保留乙個
let arr =[0
,1,2
,2,3
,3,3
,4];
let filterarr =
unique
(arr)
filterarr =>[1
,1,1
,2,2
,2,3
,3];
使用雙for迴圈遍歷,大概思路。外層迴圈從陣列第0項開始遍歷,內層迴圈從第i+1項開始遍歷到陣列最後的位置,如果有重複的項就刪除。
const
unique
=(arr)
=>
}return arr;
}
這裡要特別注意的是j–這個操作,因為splice刪除陣列某一項會導致陣列挪位,如果出現連續重複的項,就會出現問題。
該方法非常消耗效能,時間複雜度為o(n^2)
2.通過物件屬性名唯一去重
思路是物件的屬性名唯一,重複的屬性名會被覆蓋,遍歷陣列的每一項,以物件屬性名的方式儲存,如果已經存在就刪去。
const
unique
=(arr)
=>
;for
(let i =
0; i < arr.length; i++
)// 第一次出現就儲存到物件中
obj[arr[i]
]= arr[i];}
return arr;
}
這種方式相對比較節省效能,但是有缺陷,想象一下如果屬性名為』1』和1,不論哪一種都會覆蓋彼此。
意思是:
如果陣列長這樣
let arr =[0
,1,'1'
,'1',2
];console.
log(
unique
(arr));
//=> [0, 1, 2]
因為不論是數字型別還是字串型別,最終都以字串形式儲存入物件。
const
unique
=(arr)
=>
return item;
}
核心思想:利用indexof()在新陣列中查詢,如果不存在返回-1的特性。
利用indexof另外乙個特性,返回陣列中該值第一次出現的索引值,利用foreach每次迴圈的index匹配,如果是第一次出現的就壓入新陣列。
const
unique
=(arr)
=>})
return item;
}
但是indexof的內部實現原理也是for迴圈,所以跟雙for迴圈類似,都非常消耗效能。
es6也提供了一些方法更加簡潔。
對於set這個類,摘自mdn
連nan都能做到不重複!!
以上我們知道set中的元素是唯一的,也就是其包含的每個value是唯一的
const
unique
=(arr)
=>
[...
newset
(arr)];
// or
const
unique
=(arr)
=> array.
from
(new
set(arr)
);
array.from()
方法就是將乙個類陣列物件或者可遍歷物件轉換成乙個真正的陣列,個人更喜歡展開運算子。
如果有更好的方法再來補充~
JS陣列去重,物件去重
例項1根據indexof去重,indexof的好處就是返回的是首次出現的位置,這樣後面即使出現的值一樣,也只能返回第一次出現的索引,當然這個只適用於簡單的陣列 物件陣列去重 const objarr const obj const newobjarr for let i 0 i objarr.len...
js 陣列去重
function unique arr if isrepeated return result 建立乙個新的陣列,迴圈原有的陣列,每取乙個數就迴圈判斷新建的陣列中是否有和這個相等的值,沒有則插入。方法簡單,但是有雙重迴圈,陣列大了之後效率低。所以能一次迴圈解決最好。var str new array...
JS 陣列去重
我總共想出了三種演算法來實現這個目的 array.prototype.unique1 function return n array.prototype.unique2 function r n為hash表,r為臨時陣列 for var i 0 i this.length i 遍歷當前陣列 retu...