2015-07-19 2 views
1

Я использую Greasemonkey/Tampermonkey для посещения страниц и внесения изменений в таблицу из 100 элементов на основе того, что находится на текущей странице.хранение и извлечение 100-элементного аэродрома

Кратковременное хранение и манипуляция массивами работают нормально, но я хочу хранить данные на постоянной основе. Я пробовал GM_getValue/GM_setValue, GM_SuperValue, localStorage и indexedDB, но я явно пропустил что-то фундаментальное. Кажется, мне не удается написать массив в постоянное хранилище, а затем прочитать его обратно в переменную, где я могу получить доступ к каждому элементу, так что variablename [32] на самом деле является 32-м элементом в таблице. (Ну, 33-й, если вы начинаете считать на ноль, что я делаю.)

Мне нужен доступ ко всей таблице из 100 элементов во время работы скрипта, потому что мне нужно вывести часть или все ее на самой странице , В самом основном случае у меня есть цикл for, который идет от 0 до 99, каждый раз печатает значение variablename [i].

У меня нет предрасположенности к какому-либо методу, я просто хочу, чтобы работа фрикинга работала в сценарии Greasemonkey/Tampermonkey.

К верхней части сценария у меня есть это:

for (var i=0; i<=99; i++) { 
    currentData[i] = localStorage.getItem(currentData[i]); 
} 

Целью вышеуказанного раздела является чтение 100 записей в массив currentData. На самом деле это не работает для меня сейчас, вероятно, потому, что я не правильно запоминаю вещи в первую очередь.

В середине, после изменения одного из элементов, я хочу, чтобы заменить его, делая это:

localStorage.setItem(currentData[specificElementToChange], differentStuff); 

Целью выше является изменение одного из 100 строк данных и сохранить его навсегда , поэтому в следующий раз, когда код в верхней части будет прочитан, он вытащит все 100 записей, причем один элемент будет изменен указанной выше строкой.

Это общий принцип.

Я не могу сказать, не работает ли я то, что я делаю, из-за какой-либо проблемы с безопасностью в Firefox/Chrome или если я хочу сделать это (постоянно сохраняя массив, где каждый раз, когда я обращаюсь к данной странице, один элементные изменения) невозможно.

Важно, чтобы я обращался к массиву с использованием формата переменной [element], но помимо этого, каким-либо образом я могу хранить эти данные и извлекать их, просто все в порядке со мной.

Что вы предлагаете для этого?

Спасибо!

+1

Как можно выбрать элементы в localStorage? Вы сами создаете их перед циклом 'for', или они уже существуют? Возможно, вам лучше сохранить ваш массив как один элемент, а не хранить каждый отдельный индекс в качестве своего собственного элемента. Вы можете сделать это с помощью JSON: http://stackoverflow.com/a/3357615/551093 –

+0

При первом запуске скрипта я устанавливаю значения по умолчанию для каждого из элементов. План состоит в том, чтобы прокомментировать эту строку после первого успешного запуска, а затем только изменить один элемент за раз. Я никогда не получал все, что работал, хотя я никогда не выполнял этот план. – greenfern

+0

Хранение массива как одного элемента не является хорошим, потому что каждый элемент сам является сложной строкой определенной длины. Я на самом деле fudging двумерный массив, используя одномерный массив с несколькими элементами в каждой отдельной строке. Или пытаться в любом случае. Является ли основной принцип хранения/чтения переменной [i] даже возможной? – greenfern

ответ

4

Я думаю, вы идете об этом неправильно. LocalStorage хранит строки, поэтому самый простой способ сохранить массив в LocalStorage - это привести его в JSON и сохранить JSON. Затем, читая его обратно, вы разбираете JSON обратно в массив.

Таким образом, чтобы прочитать его, вы сделаете это:

var currentData = JSON.parse(localStorage.getItem("currentData") || "[]"); 

Чтобы сохранить ваши данные, вы делаете это:

localStorage.setItem("currentData", JSON.stringify(currentData)); 

Работа демо: http://jsfiddle.net/jfriend00/6g5s6k1L/


Когда делая это таким образом, currentData - это переменная, которая содержит нормальный массив (после того, как вы прочитали данные из Lo calStorage). Вы можете добавлять элементы к нему с .push(), читать элементы с числовым индексом, такие как:

var lastItem = currentData[currentData.length - 1]; 

Или изменить элемент в массиве с:

currentData[0] = "newValue"; 

Конечно, это просто обычный массив , поэтому вы можете использовать любые методы массива на нем.

+0

Простите мое высшее невежество, но в моем мозгу все еще есть разъединение. Я вижу, как вы используете push для добавления элементов в список. Я мог бы создать свой первоначальный «массив» таким образом. Но как мне получить доступ и изменить, скажем, десятую вещь в этом списке, а затем вставить ее обратно в нужное место, так что вся штука остается того же размера, но с другим 10-м элементом? Я уверен, что это вопрос, когда я смотрю на проблему с неправильной точки зрения, поэтому я ценю ваше терпение. – greenfern

+0

@greenfern - 'currentData' - массив, как только вы его загрузили, и вы получите доступ к нему, как и любой другой массив. 'var item = currentData [10];' или 'currentData [3] =" foo ";' Все зависит от того, что вы хотите сделать с массивом, но массивы обычно обращаются с помощью числового индекса. Доступ к объектам осуществляется по имени свойства. – jfriend00

+0

Я установил начальные значения, используя push. И я изменил конкретный элемент, используя 'currentData [x] =" newValue "' И во время этого прогона все данные хороши. Но когда я пытаюсь прочитать его обратно, на следующем прохождении с использованием 'var currentData = JSON.parse (localStorage.getItem (" currentData ") ||" [] ");' данных просто нет. Это не определено. Это та же проблема, что и у меня. Я манипулировал данными различными способами во время первого прохода, но я никогда не смогу успешно восстановить данные при следующем нажатии. Изменяет ли значение currentData [x] значение, сохраненное в файле? – greenfern

Смежные вопросы