考虑以下对象库,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
指向的数组中搜索它键?
或者每次我想查看时都必须使用光标?
一些可能有用的参考资料是:
答案 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){...};