Проверка уникальности localstorage и обновление

154
27 декабря 2019, 17:50

Сохраняю в localstorage массив:

var myLikes = [];
myLikes[0] = {'slide':slide_id}
localStorage.setItem("myCollection", JSON.stringify(myLikes));

Далее мне нужно проверить является ли новое значение уникальным и если нет - добавить его в массив myCollection. Пытаюсь сделать это так:

var slide_id = $$('#likes').attr('slide_id');
var arrayLikes = JSON.parse(localStorage.getItem('myCollection')); 
for (var i = 0; i < arrayLikes.length; i++) {
    if (slide_id == arrayLikes[i].slide) { // dublicate
      console.log('Dublicate');
    } else {
      console.log('New' + arrayLikes[i].slide);
      arrayLikes.push({'slide':slide_id});
      localStorage.setItem("myCollection", JSON.stringify(arrayLikes));
    }
}

В итоге проверка не работает и в localstorage добавляются все значения, в том числе дубликаты + массив начинает увеличиваться в геометрической прогрессии.

Что я делаю не так и как мне правильно выполнить проверку?

Answer 1

var slide_id = $('#likes').attr('slide_id'); 
var arrayLikes = JSON.parse(localStorage.getItem('myCollection')); 
var found = false; 
for (var i = 0; i < arrayLikes.length; i++) { 
  if (slide_id == arrayLikes[i].slide) { // dublicate 
    found = true; 
    break; 
  } 
} 
if (found) { 
  console.log('Dublicate'); 
} else { 
  console.log('New' + arrayLikes[i].slide); 
  arrayLikes.push({ 
    'slide': slide_id 
  }); 
  localStorage.setItem("myCollection", JSON.stringify(arrayLikes)); 
}

Answer 2

Объектный подход весьма сильно упростил бы эту задачу.
Например, можно унаследовать от Array:

class MyLikes extends Array {
  constructor(storageKey) {
    super(); 
    Object.assign(this, JSON.parse(localStorage.getItem(storageKey) || '[]')); 
  }
  findLikeIdx(likeObj) { return this.findIndex(o => o.slide == likeObj.slide); }
  addLike(likeObj) {
    const idx = this.findLikeIdx(likeObj); 
    return (idx >= 0) ? idx : this.push(likeObj) - 1;
  }
  store(storageKey) { localStorage.setItem(storageKey, JSON.stringify(this)); }
}
const stKey = 'myCollection', 
const likes = new MyLikes(stKey);     // создание экземпляра объекта и чтение данных из localStorage
/* ... */
likes.addLike({ slide: slide_id });   // добавление без дубликатов
/* ... */
likes.store(stKey);                   // запись в localStorage 

READ ALSO
Изменить форму input-а

Изменить форму input-а

Вывожу в таблице в инпуты значения из бд

134