Добавление и обновление элемента в localstorage

364
01 августа 2017, 19:16

Допустим у меня в localstorage есть некие данные по ключу testObject:

[{"some_obj":{"count":"1111","total_price":"112"}}]

У меня есть такой объект:

myObj = { "1111": {"count" : "12", "total_price": "23232"}}

Сохраняю его в localstorage:

var oldItems = JSON.parse(localStorage.getItem('testObject')) || [];
oldItems.push(myObj ); 
localStorage.setItem('testObject', JSON.stringify(oldItems));

Он добавляется.

Но, допустим у меня есть другой объект:

myObj2 = { "1111": {"count" : "128", "total_price": "11111"}}

Как сделать так, чтобы был заменен уже существующий объект в массиве localstorage?

Т.е. чтобы на выходе в localstorage было:

[
    {"some_obj":{"count":"1111","total_price":"112"}}, 
    {"1111":{"count":"12","total_price":"23232"}}
]

А не:

[
    {"some_obj":{"count":"1111","total_price":"112"}}, 
    { "1111": {"count" : "12", "total_price": "23232"}}, 
    {"1111":{"count":"12","total_price":"23232"}}
]

UPDATE: Решил все-таки вместо массива хранить так:

 {
    "9775":{"total_price":"296.40","total_count":"6","items":["643368"]},
    "9776":{"total_price":"0.00","total_count":"0","items":["643370"]}
 }

Возник еще такой вопрос, как правильно запихнуть туда массив items? Сейчас делаю так:

var oldItems = JSON.parse(sessionStorage.getItem("totalObj")) || {};
    var t = oldItems[sectionId] = {};
    t['total_price'] = $("#total_sum").text();
    t['total_count'] = $("#total_count").text();
    var items = t['items'] || [];
    t['items'] = items;
    t['items'].push(tr.attr("id"))
    sessionStorage.setItem("totalObj", JSON.stringify(oldItems));

Но в таком случае, он не добавляет элемент в массив, а перезатирает предыдущие элементы.

Answer 1

При данной структуре данных может сработать что-то такое:

var oldItems = JSON.parse(localStorage.getItem('testObject')) || [];
var newItem = { "1111": {"count" : "128", "total_price": "11111"}};
var isReplaced = false;
var newItemKey = Object.keys(newItem)[0]; // id нового товара
for(var i = 0; i < oldItems.length; i++) {
  var oldItemKey = Object.keys(oldItems[i])[0];
  if(oldItemKey == newItemKey) {
    // новый товар уже есть в списке товаров - заменяем
    oldItems[i] = newItem;
    isReplaced = true;
    break;
  }
}
if(!isReplaced) {
  // нового товара не было в списке - добавляем
  oldItems.push(newItem);
}
localStorage.setItem('testObject', JSON.stringify(oldItems));
READ ALSO
Ошибка при сборке проекта на webpack

Ошибка при сборке проекта на webpack

При запуске сборки в консоль вылетает вот такая ошибка:

345
ReactJS вызов компонента

ReactJS вызов компонента

Как вызвать компонент на JSX используя значение state?

248
Удаление из массива информацию

Удаление из массива информацию

Имеется такой массив:

282
Помогите с настройкой Brackets

Помогите с настройкой Brackets

ЗдравствуйтеНужно сделать в Brackets, что бы тег перемещался через строчку, а писать можно было сразу между тегами с пробелами или табуляцией

304