JSON localStorage
Привет всем встала задача сделать Json массив по которому будет храниться некоторая информация а точнее.
1. Создается Массив JSon 2. Дополняем массив 3. Если необходимо удаляем из массива не нужные параметры 4. Сравниваем массив на изменения и обновляем его. PS. На чистом JS без jQuery По 1 пункту это мне далось легко: var tovar_list = [{ "tovar":"tovar_26", "price":"266" }]; localStorage.setItem("tovar_list",JSON.stringify(tovar_list)); По 2 пункту как всегда наш о великий Google стал помогать: var tovar_list = [{ "tovar":"tovar_27", "price":"362" }]; if (localStorage.getItem("tovar_list ")) { alert('Вывод'); var data = {}; data = localStorage.getItem("tovar_list ");// Вытаскиваем массив if (data>''){stavka = JSON.stringify(tovar_list)+','+JSON.stringify(stavka)} alert (JSON.stringify(stavka) ); localStorage.setItem("tovar_list ", tovar_list);// записываем полученный новый массив обьединеный }else{ localStorage.setItem("tovar_list ",JSON.stringify(tovar_list)); // Записываем массив если он пуст то пишем по умоланию alert('Запись '+ tovar_list); } И в итоге у меня появились какието слэши и с каждым добовление нового значение слэши увеличиваются "\"{\\\"tovar\\\":\\\"tovar_23\\\",\\\"price\\\":\ \\"3624\\\"}\",{\"tovar\":\"tovar_21\",\"price\":\ "424\"} И хотел бы уточнить чтобы это все было в JSON и было удобно долять элементы что можете подсказать, я не гуру но понимаю код и как всегда мы учимся чемуто новому |
Цитата:
var data = JSON.parse(localStorage.getItem("tovar_list "));// Вытаскиваем массив |
Цитата:
|
Цитата:
var data = {}; - объявлена переменная как объект, которая затем заменяется строкой data = localStorage.getItem("tovar_list "); Ну а что дальше будет бардак, пояснять не надо. |
Я переделал немного код на
if (localStorage.getItem("tovar_list")) { data = localStorage.getItem("tovar_list");// Вытаскиваем массив if (data>''){stavka = data+','+JSON.stringify(tovar_list)} alert (JSON.stringify(tovar_list) ); localStorage.setItem("tovar_list",tovar_list);// записываем полученный новый массив обьединеный }else{ localStorage.setItem("tovar_list",JSON.stringify(tovar_list)); // Записываем массив если он пуст то пишем по умоланию alert('Запись '+ tovar_list); } Теперь отображается "{\"tovar\":\"tovar_23\",\"price\":\"3624\"},{\"tovar\":\"tovar_21\",\"price\":\"424\"} Но я как понимаю что это не JSON формат а строковый, как тогда его сделать в JSON я уже запутался |
У вас массив объектов, следовательно по умолчанию должен быть массив. Вот так: есть сохраненный, значит получаем, добавляем, сохраняем и т.д.
var data = localStorage.tovar_list && JSON.parse(localStorage.tovar_list) || []; data.push({data : new Date().toString()}) localStorage.tovar_list = JSON.stringify(data); alert(JSON.stringify(data)) Все нормально? |
Цитата:
Ваще не понял что о чем |
Цитата:
localStorage хранит ни массивы, ни объекты, ни т.п., а строки. Ваш объект в нем будет хранится в виде json-строки, после преобразования JSON.stringify(), и localStorage.getItem("tovar_list");// Вытаскиваем массив это "вытащили" не массив, а строку, а чтобы она была массивом объектов, ее нужно преобразовать в таковой объект, и делает это JSON.parse(). Только после этого можно манипулировать массивом и объектами в нем. https://developer.mozilla.org/ru/doc...l_Objects/JSON |
Цитата:
var data = localStorage.tovar_list && JSON.parse(localStorage.tovar_list) || []; Он мне постоянно возвращает [] когда мне надо если есть в localStorage уже что то то дополнить если нет то создать |
Цитата:
localStorage.tovar_list - если в локальном хранилище есть свойство tovar_list && JSON.parse(localStorage.tovar_list) - и получаем объект || []; - иначе объявляем массив Это и есть выполнение "когда мне надо если есть в localStorage уже что то то дополнить если нет то создать". Хотя это условие можно описать и иначе. У вас проблемы не в этом, а в том, что вы работая со строкой, думаете, что это объект. Запустите несколько раз пример что я приводил, будет видно как в массив добавляется новые объекты. При этом json корректна. |
Да я посмотрел Ваш код работает, Но как мне использовать эту строчку по уму
data.push({data : new Date().toString()}) Когда у меня данные var tovar_list = { "tovar": p1, "price": p2, "tip": p3, "sort": p4, "massa": p5 }; Делаю data.push({data : new tovar_list}) не помогает |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Я разобрался и у меня получилось использовать Ваш код под свои корректировки правильно коротко говоря вот var tovar_list = { "tovar": p1, "price": p2, "tip": p3, "sort": p4, "massa": p5 }; var data = localStorage.tovar_list && JSON.parse(localStorage.tovar_list) || []; data.push(tovar_list) localStorage.tovar_list = JSON.stringify(data); alert(JSON.stringify(data)) Подскажите пожалуйста еще такой момент как можно удалить часть массива А точнее полностью {"tovar": p1,"price": p2,"tip": p3,"sort": p4,"massa": p5} Зная только данные о "tovar": p1 |
Цитата:
data.push(tovar_list) Вот только зачем? Если есть объект, свойства которого могут изменять и который нужно хранить, зачем же его прятать в массив, храните сам объект. |
Цитата:
Цитата:
Вы что делаете, корзину товаров на клиенте? |
Цитата:
Я посмотрел метод splice() и прихожу к тому что мне надо в массиве создать ключь и в ключе иметь параметры и если надо удалить то что то удаляю я ключь с параметрами или можно по другому ? И чуть не забыл как можно избавиться от добовления дублей в этом ммассиве предположим добавили торт 1,2,3 и пользователь опять жмет на 2 торт но он уже естькак его не добовлять ? |
Цитата:
Нет ключей в js-массивах, так как в JS нет ассоциативных массивов, но есть объекты, в которых свойства и будут ключами ассоциации. То есть ход вашей мысли правильный, но только не массив, а объект хранящий объекты, свойствами первичного объекта которого будут уникальные идентификаторы ваших товаров или чего-то, что "фиксят" ваши менеджеры. То есть: var data = { p1 : { price: p2, tip: p3, sort: p4, massa: p5 }, ..... } если p1 и есть уникальный идентификатор. Такое хранение решит и проблему дубликатов. |
Цитата:
|
Цитата:
data[идентификатор] = {данные} Если такое свойство (идентификатор) уже есть в объекте data, то его данные заменится новыми, иначе в data будет добавлено новое свойство (идентификатор) с данными. Если есть необходимость узнать есть ли свойство (идентификатор) в объекте, то можно получить свойства объекта в массив и в нем проверить: if(~Object.keys(data).indexOf(свойство)) { //есть такое свойство у объекта } PS. Тут важен контекст понятия "узнать", можно ведь просто проверить что вернет обращение к свойству объекта, а не перебирать ключи. PS. А удалить свойство объекта - delete data[свойство] |
Подскажите еще такой вопрос. Я делаю ключь var key = tov_key+key_ves+key_name; alert(key); var tovar_list = {key:{ "tovar":"tovar_27", "price":"362" }}; И на выходе получаю key:{"tovar":"tovar_27","price":"362"} -- а надо чтобы key изменилось на то что я указывал а не названием переменной. И еще такой момент как я могу сжать key предположим он будет в длину 450 символов что и есть неудобно и превести его в единый формат типа Base64 или MD5 нашел статейки но так и не понял почему не работает |
Цитата:
Цитата:
Цитата:
$a = [ 'as' => 'value', 25 => 'value' ] Вопрос - можно ли кличи этого массива переименовать? |
Цитата:
Кстати, Base64, это скорее экспандер, а не сжиматель, так как результат будет в три раза длиннее исходного, а MD5, это хеш. |
Цитата:
|
Цитата:
|
Ну в общем вот массив который у меня формируется:
[ {"key":"16a3f79f7f1abc856e3a897ed5c71616","param":{"tip":"1","tip2":"tewer"}}, {"key":"1a79c7ebdb390269cca0d2675ef78204","param":{"tip":"1","tip2":"sik"}}, {"key":"83bec884740a900a86f06a0963f07e82","param":{"tip":"1","tip2":"anlo"}} ] Я за место Object.keys(data).indexOf пошел немного другим методом var val,param,num_s = 0; for (val of data) { num_s++; param = JSON.stringify(val); alert(param.key+' = '+num_s) } Если я пишу alert(param+' = '+num_s) то выводит каждую строку: [{"key":"83bec884740a900a86f06a0963f07e82","param":{"tip":"1","tip2":"anlo"}}] В интернете пересмотрел методы перебора массивов и там не описано более сложный формат В итоге я пробывал и так alert(param.key+' = '+num_s) И так alert(param[1]+' = '+num_s) И так alert(param[0].key+' = '+num_s) В итоге так и не могу вытащить нужный мне параметр "key" выдет постоянно "undefined" Как его правильно указать ? |
Так как вы представляете свои объекты через .... понятно что, поэтому и маетесь. Ну была мысль в правильном направлении - не массив, а объект объектов.
Что это вообще за хрень такая "key":"83bec884740a900a86f06a0963f07e82", то что вы и пытаетесь переименовать? Хрен с ним, переименовывайте, но у этой сущности тем более должен быть уникальный идентификатор, иначе она будет потеряна. for (val of data) { ... у вас массив объектов, и если перебирать циклом для поиска, то обычный for(var i=0; i< data.length; i++) { if(data[i].key == 'hash') { //что-то делаем break; } } |
Цитата:
Эта хрень и есть идентификатор, а точнее основные параметры товара переведены в MD5, я думаю что это сравнивать легче чем строку в 350 символов |
Цитата:
Некие ключи по параметрам, это уже иное, причем если товаров много, то гарантии того, что среди них нет с одинаковыми параметрами, а значит и уникальности таких ключей, нет и все ваше накроется медным тазом. ) |
Цитата:
Там видете какая фишка чтобы у менеджера допустим за сегодня не повторялось значение этого товара пока он находится в работе на сайте, эту уникальность я и могу добиться с MD5 |
Цитата:
Я не спорю, что нельзя использовать собственные значение как ключи, например это же делается в случае тегов. Но каким образом можно обеспечить уникальность в вашем случае основанных на параметрах? Конечно мне не известно многое, либо вы излагаете так, что такого просто не может быть, так как если понимать все как есть, то например: товар А синий квадратный товар Б зеленый круглый товар Г синий квадратный И если хеш по параметрам, то у товара А и Г они будут одинаковы. Но если все у вас Ок, то как перебрать и найти показано. |
И да, все ведь еще зависит и от того какова цель хранения. Например, если некто работает с определенным набором, то в хранилище в конечном итоге достаточно хранить только идентификаторы этого набора. При входе вновь, к базе потребуется только один запрос - загрузить сущности этих идентификаторов, и продолжать работать.
Но это к слову, так как цели ваши не известны. |
Цитата:
И даже при таком for(var i=0; i< data.length; i++) { alert(JSON.stringify(data[i].key)); ИЛИ так alert(data[i].key); } Выходит undefined А я привык видеть что мне сравнивать |
Цитата:
var data = [ {"key":"16a3f79f7f1abc856e3a897ed5c71616","param":{"tip":"1","tip2":"tewer"}}, {"key":"1a79c7ebdb390269cca0d2675ef78204","param":{"tip":"1","tip2":"sik"}}, {"key":"83bec884740a900a86f06a0963f07e82","param":{"tip":"1","tip2":"anlo"}} ]; for(var i=0; i < data.length; i++) { alert(data[i].key) //если ищем в хеш определенный, то if(data[i].key == '1a79c7ebdb390269cca0d2675ef78204') { alert(i) //индекс в котором найден объект с данным хеш break } } |
Цитата:
var data = localStorage.stavka && JSON.parse(localStorage.stavka) || []; for(var i=0; i < data.length; i++) { alert(data[i].key) //если ищем в хеш определенный, то if(data[i].key == '1a79c7ebdb390269cca0d2675ef78204') { alert(i) //индекс в котором найден объект с данным хеш break } Ничего не меняя цыкл идет это видно но по пораметру alert(data[i].key) отображает undefined |
Удивительно покалдовал и заработало видимо где-то в синтаксисе ошибка или кэш
|
Цитата:
|
Цитата:
Я же уже написал что подправил, подскажите такой момент по удаления Вы подсказали использовать splice я его спользую так data.splice(0, i); Он работает и даже все хорошо но вот проблемка есть он удаляет и все последующие значения что есть в массиве, а как удалить только определенные индексы массива |
Цитата:
|
Часовой пояс GMT +3, время: 08:52. |