我有这个对象数组:
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
数组具有重复值,则过滤后的数组应具有重复对象。
答案 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)
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)