有没有一种优雅的方法来确定是否像这样的数组:
[
{id: 1, value: false},
{id: 2, value: true},
{id: 3, value: false},
{id: 4, value: true},
{id: 5, value: true}
]
包含具有ID的项目,该ID在另一个数组中列出,如下所示:
[1,5]
在这种情况下,仅应返回以下值:
{id: 1, value: false},
{id: 5, value: true}
我正在尝试使用
includes()
,但是不起作用:let array = [
{id: 1, value: false},
{id: 2, value: true},
{id: 3, value: false},
{id: 4, value: true},
{id: 5, value: true}
];
array.includes([1,5])
最佳答案
我建议您使用Set
。由于您正在搜索数据中的特定键,因此在大型搜索数组上,它的性能会更好:
const data = [
{id: 1, value: false},
{id: 2, value: true},
{id: 3, value: false},
{id: 4, value: true},
{id: 5, value: true}
]
const search = (data, terms) => {
terms = new Set(terms)
return data.filter(({ id }) => terms.has(id))
}
console.log(search(data, [1, 5]))
关于表演的另一个说明。如果您的代码多次使用不同的术语调用
search
,则可以考虑在Map
(或对象)中为数组建立索引:const data = [
{id: 1, value: false},
{id: 2, value: true},
{id: 3, value: false},
{id: 4, value: true},
{id: 5, value: true}
]
const indexedData = new Map(data.map((el) => [el.id, el]))
const search = (...terms) => {
return terms.map((id) => indexedData.get(id)).filter(e => e)
}
console.log(search(1, 5, 10))
最新的脚本只会遍历整个数据一次,然后复杂度将为
o(n)
,n
是您的搜索词。编辑:Here's a benchmark of all solutions for you to play with