アップデート:
これはスケルトンの例です。village.id と Village.name だけを保存したい場合は、デフォルト データを変更するだけで機能します。すべてのコードを変更しました。コードの下で配列を反復処理して村のデータを取得する方法がわかります。
最初に、多次元配列にデータを保存するのは本当に悪い習慣だと言わなければなりません。
簡単に操作できるよりも、オブジェクトを使用する必要があります。これにより、データが整理されます。
これがあなたの状況のオブジェクトの例です。
var village = {
id: "1325848",
name : "village1"
};
console.log(village.id); //1325848
console.log(village.name); //village1
これは基本的な開始例です。
localstorage と 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"
?
ユーザーがこの拡張機能を初めて実行したとき、localstorage にはデータがありません。デフォルトの村のリストが使用されるので、
私の例では、デフォルトの村のリストは、
[
{id: "1325848", name: "village1"},
{id: "8744351", name: "village2"},
{id: "8952187", name: "village3"}
]
このデフォルト リストは localstorage に保存されます。拡張機能が再度実行された後 (初回ではない)、既定のリストはもはや重要ではありません。これは、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