2015-10-30 298 views
0

我有對象的數組看起來像這樣的:濾波器陣列

var arr = [{ 
    a: 1, 
    b: 321, 
    c: 556, 
    d: 8 
}, { 
    a: 1, 
    b: 22, 
    c: 21, 
    d: 8 
}, { 
    a: 1, 
    b: 1, 
    c: 43, 
    d: 8 
}, ]; 

另一份則可能是:

var list = ['a', 'c', 'd']; 

由於我的列表只有鑰匙a,c和d我想擺脫我的原始數組上的b鑰匙的所有實例。所有這些過程都必須是動態的,因爲我無法知道這些密鑰在接收之前可能會發生什麼。

有沒有一個很好的,乾淨的方式來做到這一點在JavaScript中?

+0

你編寫任何代碼? – ergonaut

+0

你想合併? 類似list = [1,1,1,556,21,43,8,8,8]? – Rodmentou

+0

@ergonaut不需要在這類問題中發佈我的代碼。我在做這件事時沒有問題,所以有人需要修復我的代碼。如果有一些我不知道的js技巧,我更感興趣。如果你會看到我的代碼,那麼它與Siguza的James的建議相同。 – dearn44

回答

1
arr.forEach(function(element) 
{ 
    for(var key in element) 
    { 
     if(list.indexOf(key) === -1) 
     { 
      delete element[key]; 
     } 
    } 
}); 

應該是不言自明。

如果你不想修改原始數組:

arr.map(function(element) 
{ 
    element = JSON.parse(JSON.stringify(element)); 
    for(var key in element) 
    { 

     if(list.indexOf(key) === -1) 
     { 
      delete element[key]; 
     } 
    } 
    return element; 
}); 
+0

由於您正在修改對象,因此可以使用'arr.forEach'縮短這一點。那麼不需要返回任何東西。 –

+0

@JamesAllardice感謝您的提示,更新了我的答案。 – Siguza

+0

即使下劃線不是一個不好的選擇,我會與這個答案。我認爲未來有人訪問該主題會更感興趣。 – dearn44

1

考慮使用underscore.js庫。它包含一個reject方法應該做的伎倆

拒絕_.reject(list, predicate, [context]) 返回列表值沒有,說實話測試(謂語)傳遞的元素。 過濾器的反義詞。

var odds = _.reject([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });

=> [1, 3, 5]

+0

'_.reject'真棒! – misantronic

+0

我有種感覺,我最終會帶着下劃線,但我希望不必依靠它。 – dearn44

+0

使用lodash https://lodash.com/docs#reject – jolsalazar

0

這就是你想要的?

for(var i=0, i < arr.length; i++) { 
    if(arr[i].b) delete arr[i].b 
} 

//更新,香草方法

var reject = [ "b" ]; 
for(var i=0, i < arr.length; i++) { 
    for(var j in arr[i]) { 
    if(reject.indexOf(j) != -1) delete arr[i][j]; 
    } 
} 
+0

這不可能是因爲它必須是動態的。如果我們讓你的解決方案動態化,那麼它就變得與Siguza的相似。 – dearn44