Я очень новичок в javascript, так что терпите меня.
Я анализирую JSON и хочу сохранить объекты в локальном хранилище. У меня есть storage.set и console.log. В журнале регистрируются все объекты, однако при проверке локального хранилища сохраняется только последний объект.
JSON:
[
{"id": 169, "year": "1997", "titles": [ "Sedm let v Tibetu", "Seven Years in Tibet", "Sedem rokov v Tibete" ]},
{"id": 251, "year": "1949", "titles": [ "Šaty ze sedmi rákosů", "Sette canne, un vestito", "Seven Reeds, One Suit" ]},
{"id": 404, "year": "1974", "titles": [ "Sedm zlatých upírů", "The Legend of the 7 Golden Vampires", "7 Golden Vampires", "Seven Golden Vampires: The Last Warning", "Qi jin shi", "七金屍", "The 7 Brothers Meet Dracula", "The Seven Brothers Meet Dracula" ]},
{"id": 723, "year": "1957", "titles": [ "Sedmá pečeť", "Det sjunde inseglet", "Riddaren och döden", "Siedma pečať", "The Seventh Seal" ]},
{"id": 1417, "year": "1967", "titles": [ "Sedm havranů" ]},
{"id": 1418, "year": "1974", "titles": [ "Sedmého dne večer" ]},
{"id": 1542, "year": "1966", "titles": [ "Sedmikrásky", "Sedmokrásky", "Daisies" ]},
{"id": 2013, "year": "1940", "titles": [ "Pán sedmi moří", "The Sea Hawk" ]},
{"id": 2292, "year": "1999", "titles": [ "Zelená míle", "The Green Mile", "Zelená míľa" ]}
]
Вот код:
var JSONURL = chrome.runtime.getURL("final.json");
requestJSON(JSONURL);
function requestJSON(url) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onload = function() {
if (xhr.status === 200) {
var json = xhr.responseText;
jsonParsed = JSON.parse(json);
jsonParsed.forEach(function(object) {
storage.set(object);
console.log(object);
// if (object.id === 2294) {
// console.log(object.year);
// }
});
}
};
xhr.send();
return true;
}
Когда я проверяю локальное хранилище, используя фоновую страницу, используя приведенный ниже код, он возвращает только последний объект из JSON:
chrome.storage.local.get(function(result){console.log(result)})
Returns:
{id: 2292, titles: Array(3), year: "1999"}
id: 2292
titles: (3) ["Zelená míle", "The Green Mile", "Zelená míľa"]
year: "1999"
__proto__: Object
Что я делаю не так? Кажется, что каждый раз, когда объект находится в хранилище, он переписывает последний. Почему?
Неправильный ли формат JSON?
РЕДАКТИРОВАТЬ: Я обновил JSON, чтобы он выглядел так:
[
{"169": {"year": "1997", "titles": [ "Sedm let v Tibetu", "Seven Years in Tibet", "Sedem rokov v Tibete" ]}},
{"251": {"year": "1949", "titles": [ "Šaty ze sedmi rákosů", "Sette canne, un vestito", "Seven Reeds, One Suit" ]}}
]
Теперь он корректно сохраняет его вЯ БЫ. Однако у меня возникла другая проблема: я могу сохранить storage.get по идентификатору, но не могу получить, например, свойство year:
storage.get("169", function(result){
console.log(result.year);
});
Когда я выполняю только console.log(result);
, оно работает.
EDIT2: также попытался использовать JSON, например:
[
{"test": [{"id": 169, "year": "1997", "titles": [ "Sedm let v Tibetu", "Seven Years in Tibet", "Sedem rokov v Tibete" ]}, {"id": 251, "year": "1949", "titles": [ "Šaty ze sedmi rákosů", "Sette canne, un vestito", "Seven Reeds, One Suit" ]}]}
]
Когда я console.log(result);
, он корректно возвращается, как показано ниже, но я все еще не могу получить доступ к чему-либо внутри. Возможно, потому что я не знаю, как ...
{test: Array(2)}
test: Array(2)
0: {id: 169, titles: Array(3), year: "1997"}
1: {id: 251, titles: Array(3), year: "1949"}
length: 2
__proto__: Array(0)
__proto__: Object
Пробовал foreach, пробовал циклически проходить через массив объектов, ничего не получалось.
Решено, благодаря Mr.wOxxOm!
Вот код:
var storage = chrome.storage.local;
var JSONURL = chrome.runtime.getURL("final.json");
requestJSON(JSONURL);
var titleID = "169"
//storage.get(titleID, d=> console.log(d['169'].year));
storage.get(titleID, function(result){
var titles = result[titleID].titles;
titles.forEach(function(item, i) {
console.log(item);
})
});
function requestJSON(url) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url);
//xhr.withCredentials = true;
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onload = function() {
if (xhr.status === 200) {
var json = xhr.responseText;
jsonParsed = JSON.parse(json);
jsonParsed.forEach(function(object) {
storage.set(object);
});
}
};
xhr.send();
return true;
}