通过具有重复键的另一个数组过滤对象数组

时间:2019-03-29 09:32:29

标签: javascript arrays reactjs object ecmascript-6

我有这个对象数组:

const data = [
    {
       id: 1,
       name: 'Name1',
       encryptionKey: 'AAA'
    },
    {
       id: 2,
       name: 'Name2',
       encryptionKey: 'BBB'
    },
    {
       id: 3,
       name: 'Name3',
       encryptionKey: 'CCC'
    }
 ]

和另一组加密密钥:

const encryptionKeys = ['AAA', 'BBB']

然后我基于data数组过滤encryptionKeys数组,如下所示:

var filtered = data.filter(function(item) {
   return encryptionKeys.indexOf(item.encryptionKey) !== -1;
});

有效并过滤对象并将其保存在新数组中。但是,问题是如果encryptionKey数组具有重复的键,例如:

const encryptionKeys = ['AAA', 'BBB', 'BBB']

然后,所有重复的键都将被忽略,在这种情况下,过滤后的数组将只有2个对象,而不是3个对象。我在过滤代码中做错了什么?如果encryptionKeys数组具有重复值,则过滤后的数组应具有重复对象。

4 个答案:

答案 0 :(得分:1)

简单-只需预先在filter上使用encryptionKeys

var filtered = data.filter(function(item) {
   return encryptionKeys.filter((e, i, a) => a.indexOf(e) == i).indexOf(item.encryptionKey) !== -1;
});

或者,从Array中创建一个Set

var filtered = data.filter(function(item) {
   return [...new Set(encryptionKeys)].indexOf(item.encryptionKey) !== -1;
});

答案 1 :(得分:1)

在进行比较和过滤之前,使您的加密密钥具有唯一性。

var encryptionKeys = ['AAA', 'BBB', 'BBB'];
var unique = encryptionKeys.filter((v, i, a) => a.indexOf(v) === i); 
console.log(unique);

答案 2 :(得分:1)

您可以映射所需的物品。

const
    data = [{ id: 1, name: 'Name1', encryptionKey: 'AAA' }, { id: 2, name: 'Name2', encryptionKey: 'BBB' }, { id: 3, name: 'Name3', encryptionKey: 'CCC' }],
    encryptionKeys = ['AAA', 'BBB', 'BBB'],
    result = encryptionKeys.map(key => data.find(o => o.encryptionKey === key));
     
console.log(result);

使用Map并预先过滤键的简短方法。

const
    data = [{ id: 1, name: 'Name1', encryptionKey: 'AAA' }, { id: 2, name: 'Name2', encryptionKey: 'BBB' }, { id: 3, name: 'Name3', encryptionKey: 'CCC' }],
    encryptionKeys = ['AAA', 'BBB', 'BBB', 'DDD'],
    map = new Map(data.map(o => [o.encryptionKey, o])),
    result = encryptionKeys
        .filter(Map.prototype.has, map)
        .map(Map.prototype.get, map);
     
console.log(result);

答案 3 :(得分:1)

记下here的浏览器兼容性,然后查看.flat()

const data = [
  {
    id: 1,
    name: 'Name1',
    encryptionKey: 'AAA'
  },
  {
    id: 2,
    name: 'Name2',
    encryptionKey: 'BBB'
  },
  {
    id: 3,
    name: 'Name3',
    encryptionKey: 'CCC'
  }
]
const keys = ['AAA', 'BBB', 'BBB', 'AAA', 'BBB', 'ZZZ']

const occurances = data.map(d => {
  const { encryptionKey } = d
  const keyedOccurances = keys
                        .filter(k => k === encryptionKey)
                        .map(k => encryptionKey === k && d)

  return keyedOccurances.length && keyedOccurances
})
.filter(Boolean)
.flat()

console.log(occurances)