2017-02-20 116 views
3

我有鍵/值對的單級陣列,像這樣:如何在jQuery的數組中刪除部分重複值

var user_filters= ['color=blue', 'size=small', 'shape=circle', 'size=large', 'shape=square'] 

我需要一個函數來執行以下操作:

  1. 發現所有重複鍵
  2. 用第二次出現替換第一次出現的鍵/值對
  3. 刪除第二次出現

在這種情況下,它會產生如下結果:

user_filters= ['color=blue', 'size=large', 'shape=square'] 

喜歡的東西...

function update_array(){ 
    $.each(user_filters, function(i){ 
     var key = this.split('=')[0]; 
     if(key is second occurrence in user_filters) 
     { 
      var index = index of first occurrence of key 
      user_filters[index] = user_filters[i]; 
      user_filters.splice(i,1); 
     } 

    }); 
} 

什麼是做到這一點的最好方法是什麼?謝謝!

+1

「什麼是做到這一點的最好方法是什麼?」 啊,這是一個古老的問題。 –

+0

如果集合包含3個重複密鑰,該怎麼辦?那你想要最後一個嗎? – dana

回答

4

我會保持數據的對象,這樣,任何重複將自動覆蓋前一個條目..

例如看到這個:

var user_filters= ['color=blue', 'size=small', 'shape=circle', 'size=large', 'shape=square']; 
 
var object = {}; 
 

 
for (var i = 0; i < user_filters.length; i++) { 
 
    var currentItem = user_filters[i].split('='); 
 
    var key = currentItem[0]; 
 
    var value = currentItem[1]; 
 
    object[key] = value; 
 
} 
 

 
console.log(object);

+0

不是輸出用戶期望的! –

+0

@ibrahimmahrir他問什麼是應該做吧..這意味着他希望看到更多的方法最好的辦法.. –

+0

這是完美的。做得很好。解決我的問題,謝謝! – p1xelarchitect

0

您可以使用一個散列對象以獲取沒有重複的鍵值對,然後將散列對象轉換回像這樣的數組:

function removeDuplicates(arr) { 
 
    var hash = arr.reduce(function(h, e) { 
 
    var parts = e.split("="); 
 
    h[parts[0]] = parts[1]; 
 
    return h; 
 
    }, {}); 
 
    
 
    return Object.keys(hash).map(function(key) { 
 
    return key + "=" + hash[key]; 
 
    }); 
 
} 
 

 
var user_filters = ['color=blue', 'size=small', 'shape=circle', 'size=large', 'shape=square']; 
 

 
console.log(removeDuplicates(user_filters));

0

你可以使用一個Map它確實獨特/自動替換,能夠讓你的數組回來的情況下,你需要它

var user_filters= ['color=blue', 'size=small', 'shape=circle', 'size=large', 'shape=square']; 
 

 
var m = new Map(user_filters.map(v => v.split("="))); 
 
console.log([...m.entries()].map(v => v.join("=")));

+0

不是輸出用戶期望的! –

+0

@ibrahimmahrir添加了他期望的輸出... – baao

0

最好從數組後面迭代,因此對於你需要保持變量真或假的每個唯一鍵(ini完全錯誤)。 所以如果真正的意思已經發生過如此刪除,否則保留它並使其變量爲真。

這是更更好的方法,然後你的電流。您不必保留最後一個索引並交換,然後刪除。

0

您可以轉換爲json,然後返回到所需的數組格式。在下面的代碼中,您將以所需的格式獲得結果對象。

var user_filters= ['color=blue', 'size=small', 'shape=circle', 'size=large', 'shape=square']; 

function toJson(obj){ 
var output = {}; 
$.each(obj, function(i){ 
    var keyvalPair = this.split('=') 
    var key = keyvalPair[0]; 
    output[key]= keyvalPair[1]; 
}); 
return output; 
} 
function toArray(obj){ 
var output = []; 
$.each(obj, function(i){ 
    output.push(i+"="+obj[i]); 
}); 
return output; 
} 
var result = toArray(toJson(user_filters)); 
console.log(result);