IndexedDB:您可以使用数组元素作为键或索引吗?

时间:2015-01-19 19:24:23

标签: javascript arrays database html5 indexeddb

考虑以下对象库,domain键设置为keyPath

var tags  = [ 
    //codes: 0 - markdown wrap tag
    //       1 - HTML wrap tag 
    //       2 - single tag
    { domain: "youtube", 

      bold:["*",0],
      strikethrough:["-",0],
      italic:["_",0] 
    },  


    { domain: "stackoverflow", 

      bold:["<strong>",1], 
      italic:["<em>",1],
      strikethrough:["<del>",1],
      superscript:["<sup>",1],
      subscript:["<sub>",1],
      heading1:["<h1>",1],
      heading2:["<h2>",1],
      heading3:["<h3>",1],
      blockquote:["<blockquote>",1],
      code:["<code>",1],
      newline:["<br>",2],
      horizontal:["<hr>",2]
    }   
];  

上面的代码运行正常,让我可以轻松有效地查找。但是,在很多情况下,商店中的两个对象除domain属性外完全相同。

例如,我想将所有Stack Exchange站点的对象添加到商店,并且所有这些对象都等于StackOverflow的对象。

因此,我想做的事情不是创建许多单独的对象:

var tags  = [ 
    //codes: 0 - markdown wrap tag
    //       1 - HTML wrap tag 
    //       2 - single tag
    { domain: ["youtube"], 

      bold:["*",0],
      strikethrough:["-",0],
      italic:["_",0] 
    },  


    { domain: ["stackoverflow","stackexchange",...], 

      bold:["<strong>",1], 
      italic:["<em>",1],
      strikethrough:["<del>",1],
      superscript:["<sup>",1],
      subscript:["<sub>",1],
      heading1:["<h1>",1],
      heading2:["<h2>",1],
      heading3:["<h3>",1],
      blockquote:["<blockquote>",1],
      code:["<code>",1],
      newline:["<br>",2],
      horizontal:["<hr>",2]
    }   
];  

是否可以使用KeyGen而不是keyPath并设置某种带有值的索引并在domain指向的数组中搜索它键?

或者每次我想查看时都必须使用光标?

一些可能有用的参考资料是:

1 个答案:

答案 0 :(得分:2)

解决方案是使用multiEntry键属性设置为true的索引

this link(感谢@kyaw Tun)

  

每个索引还有一个multiEntry标志。当评估索引的键路径的结果产生数组时,此标志会影响索引的行为方式。如果multiEntry标志为false,则将其键为Array的单个记录添加到索引中。如果multiEntry标志为true,则将一条记录添加到Array中每个项目的索引中。每条记录的关键是数组中相应项目的值。

使用此index,不再需要特定的keyPath,因此您可以使用keyGen来简化。


所以,要创建数据库:

request.onupgradeneeded = function(event) 
{
   var db = event.target.result;
   var objectStore = db.createObjectStore("domains", {autoIncrement: true });
   objectStore.createIndex("domain", "domain", { unique: true, multiEntry: true });
   for(var i in tags)
   {
       objectStore.add(tags[i]);
       console.log("added " + tags[i]["domain"] + " to the DB");
   }
};  

以及使用域查询对象的示例:

    var objectStore = db.transaction("domains").objectStore("domains");
    var query = objectStore.index("domain").get(queryURL);
    query.onsuccess = function(event){...};