更新:
这是一个骨架示例,如果您只想存储村庄.id 和村庄.name,只需更改默认数据,仍然有效。我已经为您更改了所有代码,您将看到如何迭代数组并在代码下方获取村庄数据。
首先我应该说将数据保存在多维数组中是非常糟糕的做法。
您应该使用对象,它使您的数据整洁,而不是您可以轻松地操作它。
这是您的情况的示例对象,
var village = {
id: "1325848",
name : "village1"
};
console.log(village.id); //1325848
console.log(village.name); //village1
这是一个基本的入门示例。
这是解决本地存储和 javascript 对象问题的方法。
var ExtensionDataName = "myfirstextensiondata";
var ExtensionData = {
dataVersion: 3, //if you want to set a new default data, you must update "dataVersion".
villages: []
};
//default data
ExtensionData.villages.push(
{id: "1325848", name: "village1"},
{id: "8744351", name: "village2"},
{id: "8952187", name: "village3"}
);
function DB_setValue(name, value, callback) {
var obj = {};
obj[name] = value;
console.log("Data Saved!");
chrome.storage.local.set(obj, function() {
if(callback) callback();
});
}
function DB_load(callback) {
chrome.storage.local.get(ExtensionDataName, function(r) {
if (isEmpty(r[ExtensionDataName])) {
DB_setValue(ExtensionDataName, ExtensionData, callback);
} else if (r[ExtensionDataName].dataVersion != ExtensionData.dataVersion) {
DB_setValue(ExtensionDataName, ExtensionData, callback);
} else {
ExtensionData = r[ExtensionDataName];
callback();
}
});
}
function DB_save(callback) {
DB_setValue(ExtensionDataName, ExtensionData, function() {
if(callback) callback();
});
}
function DB_clear(callback) {
chrome.storage.local.remove(ExtensionDataName, function() {
if(callback) callback();
});
}
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop))
return false;
}
return true;
}
DB_load(function() {
//YOUR MAIN CODE WILL BE HERE
console.log(ExtensionData);
console.log(ExtensionData.villages); //array of villages
console.log(ExtensionData.villages[0]); //first village object
console.log(ExtensionData.villages[0].id); //first village id
console.log(ExtensionData.villages[0].name); //first village name
//HOW TO ITERATE VILLAGES
for (var i = 0; i < ExtensionData.villages.length; i++) {
console.log(ExtensionData.villages[i].id); //village id
console.log(ExtensionData.villages[i].name); //village name
}
});
问题:
- ExtensionDataName 是否相同?或者我可以改变吗?
ExtensionDataName 用作将数据保存到本地存储时的名称,它只是您的数据集合的名称。因此,你当然可以改变它,做你想做的,这取决于你。
- 当您更改此行的编号时,您实现的目标是什么:
dataVersion: 3, //if you want to set a new default data, you must update "dataVersion"
?
用户第一次运行此扩展时,本地存储中没有数据。所以使用默认的村庄列表,
在我的示例中,默认村庄列表是,
[
{id: "1325848", name: "village1"},
{id: "8744351", name: "village2"},
{id: "8952187", name: "village3"}
]
此默认列表保存到本地存储。当扩展再次运行(不是第一次)之后,默认列表不再重要,因为在 localstorage 中存储了一个村庄列表,所以它从 localstorage 加载村庄列表。
例如,如果您想在扩展运行时添加一个新村庄,您可以这样做,
ExtensionData.villages.push({id: "1215555", name: "village4"});
DB_save();
那么目标是dataVersion
什么?
如果你看DB_load()
功能,它在那里使用。它检查 dataVersion 是否仍然相同,如果不同,它决定
“有一个更新的默认数据,所以我应该清除本地存储并将新数据重新加载到本地存储”
所以如果你不改变这条线,
ExtensionData.villages.push(
{id: "1325848", name: "village1"},
{id: "8744351", name: "village2"},
{id: "8952187", name: "village3"}
);
比你不会改变dataVersion