简体   繁体   中英

Filter array of objects based on another array of objects in javascript

I have an array like this

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

Each object has two key/value pairs, a letter and color. I have another array like this

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

Is it possible to filter the first array such that the final result is an array that only has the objects that have the same keys as the second array. (without a for or while loop)

In this scenario it would be:

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

So I want something like:

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

But I'm not sure how to do this without looping over all the keys of filter .

You could use a Set for the property names and filter the array.

 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; } 

You can do this with fiter() , some() and 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) 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM