Если я console.log (localStorage.getItem ("cartCache")), результат выглядит так:

{"dataCache":[{"id":20,"quantity":1,"total":100000,"request_date":"27-08-2017 20:31:00"},{"id":53,"quantity":1,"total":200000,"request_date":"27-08-2017 20:38:00"}]}

Я хочу удалить данные в кеше по id

Например, я удаляю id = 20, это удалит id = 20 в кеше

Итак, результат должен быть таким:

{"dataCache":[{"id":53,"quantity":1,"total":200000,"request_date":"27-08-2017 20:38:00"}]}

Как я могу это сделать?

3
Success Man 27 Авг 2017 в 13:13

4 ответа

Лучший ответ

Вы можете использовать array#splice() для удаления элемента из массива. Используйте JSON.parse(), чтобы получить объект из localStorage, а затем переберите свой массив и удалите элементы, сравнив их идентификатор, а затем сохраните результат обратно в localStorage.

var str = localStorage.getItem('cartCache'); 
var cartCache = JSON.parse(str);
var idToRemove = 20;
cartCache.dataCache.forEach((obj,i) => {
  if(obj.id === idToRemove)
    cartCache.dataCache.splice(i,1);
});
localStorage.setItem('cartCache', JSON.stringify(cartCache));
1
Hassan Imam 27 Авг 2017 в 11:09

Вот вам пример решения https://jsfiddle.net/rhwf1j5g/1/

var data = {"dataCache":[{"id":20,"quantity":1,"total":100000,"request_date":"27-08-2017 20:31:00"},{"id":53,"quantity":1,"total":200000,"request_date":"27-08-2017 20:38:00"}]};

var removeid = 20;

var newData = $.grep(data.dataCache, function(value) {
  return value.id != removeid;
});

console.log(newData);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Вот решение для вашего сценария

var data = JSON.parse(localStorage.getItem("cartCache"));

var removeid = 20;

var newData = $.grep(data.dataCache, function(value) {
  return value.id != removeid;
});

localStorage.setItem("cartCache", { "dataCache" : newData });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Надеюсь, что это поможет вам.

1
Shiladitya 27 Авг 2017 в 10:31

Вы можете попробовать это:

const filtered = JSON.parse(localStorage.cartCache)
.dataCache.filter(filteredObj => filteredObj.id !== 20);

localStorage.cartCache = JSON.stringify({ "dataCache": filtered });

Я просто использую метод parse() объекта JSON для преобразования элемента из localStorage в объект JS.
Я приковываю вызов к цепочке, обращаясь к dataCache напрямую, вместо того, чтобы назначать его переменной, затем я цепью вызова filter(), поскольку возвращаемое значение dataCache является массивом. Я отфильтровываю данные, где id не равен 20.
Я присваиваю результат переменной filtered, после чего вызываю stringify(), передавая результат filtered.
Наконец, я сохраняю его в localStorage.

// LocalStorage Mock
let localStorageMock = (function() {
  var storage = {};

  return {
    setItem: function(key, value) {
      storage[key] = value || '';
    },
    getItem: function(key) {
      return storage[key] || null;
    },
    removeItem: function(key) {
      delete storage[key];
    },
    get length() {
      return Object.keys(storage).length;
    },
    key: function(i) {
      var keys = Object.keys(storage);
      return keys[i] || null;
    }
  };
})();
Object.defineProperty(window, 'localStorage', { value: localStorageMock });


// Code you need
localStorage.cartCache = JSON.stringify({"dataCache":[{"id":20,"quantity":1,"total":100000,"request_date":"27-08-2017 20:31:00"},{"id":53,"quantity":1,"total":200000,"request_date":"27-08-2017 20:38:00"}]});

const filtered = JSON.parse(localStorage.cartCache)
.dataCache.filter(filteredObj => filteredObj.id !== 20);

localStorage.cartCache = JSON.stringify({ "dataCache": filtered });
console.log(JSON.parse(localStorage.cartCache));
0
John Kennedy 27 Авг 2017 в 11:18

Вам нужно получить объект, изменить его, а затем сохранить его снова в локальном хранилище,

var retrievedObj = JSON.parse(localStorage.getItem("cartCache"));
retrievedObj.dataCache[0].id = 53;
localStorage.setItem('cartCache', JSON.stringify(retrievedObj));
2
Sajeetharan 27 Авг 2017 в 10:19