数组键路径上的索引找不到任何值

时间:2017-11-10 11:43:29

标签: javascript indexeddb firefox-webextensions

我想熟悉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上搜索到目前为止我发现在keypath中不可能有变量键,但不管怎么说都不应该这样。
因此,我真的没有看到可能导致搜索在数据库中找不到对象的原因。

1 个答案:

答案 0 :(得分:2)

  1. 看起来第二级对象是数组,而不是第一级对象的属性。 .访问器访问子属性,而不是数组的索引。
  2. IDBObjectStore.prototype.get总是在没有错误时成功,并不表示是否找到匹配。
  3. 关于第1点的更多内容。请看"att1":[{"sub11" : "content1","sub12" : [ "word" ]}...。假装这是一个真正的基本JavaScript对象。你能使用att1.sub11吗?不可以。因为att1的值是数组,而不是对象。