2017-07-31 62 views
3

對象的另一個陣列對象的濾光器陣列我有這樣基於以JavaScript

arr1 = 
[ 
    {A: 'red', B: 'blue'}, 
    {Q: 'green', R: 'blue'}, 
    {B: 'green', M: 'red'}, 
    {Q: 'white', R: 'blue'}, 
    ... 
] 

每個對象的陣列具有兩個密鑰/值對,字母和顏色。我有這樣

filter= 
[ 
    {A: 'val', B: 'someval'}, 
    {B: 'anothervalue', M: 'value'} 
] 

另一個陣列是否有可能所述第一陣列,使得最終結果是一個數組只具有具有相同鍵作爲第二陣列中的對象進行過濾。 (無for或while循環)

在這種情況下這將是:

[ 
    {A: 'red', B: 'blue'}, 
    {B: 'green', M: 'red'} 
] 

所以,我想是這樣的:

let filteredArr = arr1.filter(obj => 
    Object.keys(obj) == Object.keys(filter[someKey])); 

但我不知道如何做到這一點沒有循環遍歷所有filter的密鑰。

回答

0

爲此,您可以用fiter()some()every()

var arr1 = [{"A":"red","B":"blue"},{"Q":"green","R":"blue"},{"B":"green","M":"red"},{"Q":"white","R":"blue"}] 
 
var filter = [{"A":"val","B":"someval"},{"B":"anothervalue","M":"value"}] 
 

 
var result = arr1.filter(function(e) { 
 
    return filter.some(function(a) { 
 
    var keyE = Object.keys(e); 
 
    var keyA = Object.keys(a); 
 

 
    return keyE.length == keyA.length && keyE.every(function(k) { 
 
     return keyA.includes(k) 
 
    }) 
 
    }) 
 
}) 
 

 
console.log(result)

3

您可以使用該屬性名稱的Set和過濾陣列。

var array = [{ A: 'red', B: 'blue' }, { Q: 'green', R: 'blue' }, { B: 'green', M: 'red' }, { Q: 'white', R: 'blue' }], 
 
    filter = [{ A: 'val', B: 'someval' }, { B: 'anothervalue', M: 'value' }], 
 
    getKey = o => Object.keys(o).sort().join('|'), 
 
    result = array.filter((s => o => s.has(getKey(o)))(new Set(filter.map(getKey)))); 
 
    
 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }