我想熟悉 indexedDB 来构建我的 Firefox WebExtension。
我的示例数据的结构如下:
const sampleDataRaw = [
{
"ent_seq" : 1413190,
"att1" : [ {
"sub11" : "content1",
"sub12" : [ "word" ]
}, {
"sub11" : "content2"
} ],
"att2" : [ {
"sub21" : "other content",
"sub22" : [ "term" ]
} ]
}, {
"ent_seq" : 1000010,
"att2" : [ {
"sub21" : "more content"
}, {
"sub22" : "more words"
} ]
}
] // end sampleRawData
我已经打开/创建了数据库,添加了示例数据并使用 objectStore.get() 和 objectStore.openCursor() 通过 ent_seq 键进行查询。
当我想使用我应该为这些字段创建的索引来搜索 sub11 或 sub21 字段时,就会出现问题:
objectStore.createIndex("sub11Elements", "att1.sub11", { unique: false });
objectStore.createIndex("sub21Elements", "att2.sub21", { unique: false });
当我想搜索字段 sub11 时,如下所示:
var index = objectStore.index("sub11Elements");
index.get("content1").onsuccess = function(event) {
// I should have the first object of my data now, alas the result is undefined instead
};
它确实成功了,但是返回的值是未定义的,因为 get() 实际上没有找到任何东西。
我想知道为什么它找不到该条目以及如何让它找到它。我想这可能是因为键路径错误,但如上所述,如果我改为搜索键(ent_seq)我可以成功获取result.att1[i].sub11值。
在 mozilla 的网站上,据说键可以是字符串和数组(或数组中的数组等)类型,并且键路径部分应该使用点连接。
通过在 stackexchange 上搜索,我到目前为止发现 key 路径中不可能有变量键,但无论如何都不应该是这样。
因此,我真的不明白是什么导致搜索找不到数据库内的对象。
最佳答案
- 看起来第二级对象是数组,而不是第一级对象的属性。
.
访问器访问子属性,而不是数组的索引。 IDBObjectStore.prototype.get
在没有错误的情况下始终会成功,并且不指示是否找到匹配项。
关于第 1 点的更多内容。请查看 "att1":[{"sub11": "content1","sub12": [ "word"]}...
。假设这是一个实际的基本 JavaScript 对象。您可以使用att1.sub11
吗?不会。因为 att1
的值是一个数组,而不是一个对象。
关于javascript - 数组键路径上的索引找不到任何值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47222045/