陣列中的鍵值對去重 陣列去重

2021-10-13 03:35:08 字數 1692 閱讀 3764

陣列去重:將陣列中重複的元素找出來並刪減為乙個。目的很簡單,方法倒有很多,以至於我費盡心思去考慮各種方法的好處壞處並進行對比,最終得出在各種場合適用的不同方法。希望有不同意見的儘管指出來。

【方法1】:

* function unique1(array)

* 原理:新定義乙個陣列,結合乙個物件輔助

* 時間複雜度:o(n)

* 適用範圍:全數字、全字串

* 方法缺點:混淆數字與數字字串,對於物件無效

functionunique1(array),a =;

for(vari =0,ilen =array.length;i

if(!obj[array[i]]),a =;

for(vari =0,ilen =array.length;i 

if((typeofobj[array[i]])!=(typeofarray[i])||obj[array[i]]!=array[i])o=obj;

returna;

這種方法在方法1的基礎上,能夠分辨出數字字串和數字,但對於物件仍無能為力。

【方法3】:

* function uniqexceptobj(array)

* 原理:查詢相同值,對陣列進行splice修改

* 時間複雜度:o(n2)

* 適用範圍:全數字、全字串、數字與字串混合、含有物件(不同物件的鍵值對均不同)

* 方法缺點:無法區分具有相同鍵值對的不同物件

* 注意!array.length不要事先獲取,如 ilen=array.length; 因為迴圈過程中array.length會變化

functionuniqexceptobj(array)

if(!(obj2 instanceofobject)||(obj2 ===null))// null is not instanceof object.

varp =0;// count propoty of obj1

for(vark inobj1)// compare inner object.

for(vark inobj2){// compare object property counter.

p--;

returnp ==0;

vartemp =array.slice(0);//設定乙個輔助陣列,避免直接修改原array陣列

for(vari =0;i

for(varj =i +1;j

if(isequal(temp[i],temp[j])){

temp.splice(j,1);

j--;

returntemp;

仍是用方法3的思路,把各個陣列元素進行對比,只是在對比時用了乙個內建函式isequal,用來有效地比較各種型別,包括物件。這種方法可以有效地對任何型別資料進行處理,但缺點明顯,時間複雜度o(n3)。所以,在不需要對物件處理的時候,還是避免使用的好。

【終於到結論了】:

從以上的各種對比來看,我們可以得出乙個前人早已得出的結論:「人無完人,金無足赤」。各個方法有各自不同的優點和缺點。

當只需要處理字串或只需要處理數字時,我們可以採用方法1;

當需要處理字串和數字混合的陣列而無需處理物件時,我們採用方法2;

當只需處理去掉同個物件而不需處理多個鍵值對相同的物件時,可以採用方法3;

當要求對不同物件但鍵值對相同的物件進行去重時,我們可以採用方法4。

原址:

字串去重 陣列去重 物件去重 巢狀去重(全)

去重這個詞,在我們程式設計師的日常中還是很常見的,字串 陣列 物件 巢狀形式的去重,各種去重應用場景,最近有空整理整理各種資料的去重方法,這裡整理的都是按照常規的資料,特殊的先不考慮,主要是看處理方法和思路。1.indexof 方法 const str asdfasd const changestr...

陣列去重 資料去重的四種方法

第一種 利用hash的原理去重即排序 var arr 1,1,1,2,2,2,55,5,4,4,88 var brr 去重複,利用相同下標的多次賦值以最新的為準 for var i 0 i brr arr i arr i 這個命令主要是去重 因為brr的下標會arr的元素 如果出現元素重複,那麼視為...

陣列的去重

陣列去重 1 var arr 4,2,5,7,2,6,2,6,6,5 console.log arr 使用迴圈依次比較,遇到重複的就刪除 比較length 1趟 for var i 0 i arr.length 1 i console.log arr 2 var arr 4,2,4,5,7,2,6,...