我有一个像这样的数组
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 :(得分: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; }
答案 1 :(得分: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)