在查找数据中搜索一系列元素



我在JavaScript中有一个可观察的数组,

lookups.Data
[...]
    __proto__: []
    length: 2884
    [0]: {...}
    [1]: {...}
    [2]: {...}
    [3]: {...}
    [4]: {...}
    [5]: {...}
    [6]: {...}
    [7]: {...}
    [8]: {...}
    [9]: {...}
    [10]: {...}

每个记录都像,

lookups.Data[0]
{...}
    __proto__: {...}
    BookName: "Silapathikaram"
    Author: "Illangovadigal"
    type: "Tamil"

我有一个 someBooks值的数组,

someBooks = ["ABC", "CED", "Silapathikaram"]

现在,我需要从不在查找数据中的某些书籍中删除书籍。

如果它是一个数组,并且我可以使用indexof,

lookup.indexOf(book) == -1 // to check the existance of the book in the lookup

谁能建议我有任何有效或简单的方法可以做到这一点?任何帮助都将非常有用。

最有效的方法是使用集合。构建一组所有书籍名称,并找到名称和someBooks的交集。

let allNames = new Set(lookups.Data.map(e => e.BookName)),
    someBooks = new Set(["ABC", "CED", "Silapathikaram"]);
let intersection = new Set();
for (var elem of allNames) {
    if (someBooks.has(elem)) {
        intersection.add(elem);
    }
}

在整个书籍名称列表中多次执行.includes会很慢,效率低下,而使用集合不应该存在此问题,但最终取决于浏览器的实现。

您可以尝试数组#filter 函数,在条件 array#include#include 函数中。

const someBooks = ['A', 'B', 'C'];
const lookup = ['A', 'C'];
const filteredBooks = someBooks.filter(book => lookup.includes(book));
console.log(filteredBooks);

为了从lookups.Data数组中不存在的某些书籍过滤值,您可以使用filtersome功能

var newbooks = someBooks.filter(value => {
    return lookups.Data.some(data => data.BookName === value)
})

最新更新