storage.set (объект) только сохранение последнего объекта - PullRequest
0 голосов
/ 19 октября 2019

Я очень новичок в 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...