有没有一种优雅的方法来确定是否像这样的数组:

[
  {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

09-16 16:53