Indexeddb索引数组的唯一行

xfb7svmp  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(2)|浏览(198)

我在IndexedDB中有一个存储,其中Key路径用于属性Id,并且我还有一个名为 IndexedWords 的索引数组

[{ Id: 1, IndexedWords: ['Foo', 'bar'] }, { Id: 2, IndexedWords: [] } }

我试图找到存储中的所有空行,这是通过找到所有具有 IndexedWords 中的值的Id+存储的所有Id,并对这些数组求交集来实现的。这个想法是可行的,但问题是我接收 IndexedWords x次的Id,其中x与 IndexedWords 中的条目数匹配,当我有5000行,每行有100+个单词时,数组变得越来越大,使用起来越来越困难。有没有办法在查询中只从IndexedDB返回不同的Id?当前代码如下

var trans = db.transaction(storeName, IDBTransaction.READ_ONLY);
var index = trans.objectStore(storeName).index("IndexedWords");
var getAllRequest = index.getAllKeys();
getAllRequest.onsuccess = function (evt) {
    items = evt.target.result;
}
wpcxdonn

wpcxdonn1#

如果我理解了您的问题,您可以尝试在IndexedWords上创建一个多条目索引,然后遍历该索引的唯一键。

ecfdbz9o

ecfdbz9o2#

我希望这会有所帮助,而不会增加IndexedDB API的开销,因为我无法让您的IndexedDB示例代码正常工作。
逐一查看文字,并建立包含文字做为索引键的新对象,如果该文字位于项目的IndexedWords中,则使用Id数组做为值。
创建一个空对象和一些示例数据

let index = [{ Id: 1, IndexedWords: ['Foo', 'bar'] }, { Id: 2, IndexedWords: ['blue', 'cat', 'mouse'] }, {Id: 242, IndexedWords: ['salmon', 'blue', 'bar']} ];
let wordz = {};

从示例数据中创建一个包含所有唯一单词的平面数组,并从包含所有单词的数组中删除重复单词,以获得不同单词的列表。

let allWords = index.map((z) => (z.IndexedWords)).flat()
allWords = [...new Set(allWords)]

迭代每个唯一的单词,并创建一个新对象,该对象以单词为键,以Id数组为值

allWords.forEach( (word) => {
    // create an empty array for the new wordz[word]
    wordz[word] = []

    // push the item Id onto wordz[word] //
    index.forEach((item) => {
        if(item.IndexedWords.indexOf(word)>=0) {
            wordz[word].push(item.Id);
            }
    })
})


console.log(wordz)

Foo: [1]
bar: (2) [1, 242]
blue: (2) [2, 242]
cat: [2]
mouse: [2]
salmon: [242]

相关问题