在 JavaScript 中,基于另一个对象数组过滤对象数组。

3
我有一个像这样的数组
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键的情况下完成此操作。

2个回答

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


0
你可以使用filter()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)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接