Ограничить повторяющиеся записи в json localstorage с помощью Javascript

#javascript #jquery #arrays #json

#javascript #jquery #массивы #json

Вопрос:

Я перешел по нескольким ссылкам, но это мне не помогло. Я должен ограничить повторяющиеся заголовки в массиве json. Что здесь можно сделать??

 function submitForm(){
  var titleInput=document.getElementById('titleName').value;
  var messageInput=document.getElementById('titleDesc').value;  
  var oldItems = JSON.parse(localStorage.getItem('itemsArray')) || [];
  var newItem = {
                    "title":titleInput ,
                    "desc": messageInput
                };

  if(!(titleInput=="" || messageInput=="")){
    oldItems.push(newItem); 
  }
}
  

Ответ №1:

Попробуйте это:

 if (!(titleInput == "" || messageInput == "")) {
       var repeated = false;
       for (var i = 0; i < oldItems.length; i  ) {
           if (oldItems[i].titleInput == titleInput) {
               repeated = true;
               break;
           }
       }
       if (repeated == false) {
           oldItems.push(newItem);
       }
   }
  

Ответ №2:

Вы могли бы просто проверить, есть ли элемент, прежде чем добавлять его.

 var alreadyExists = oldItems.some(function (item) { return item.title == titleInput; }); 

if(!(titleInput=="" || messageInput=="") amp;amp; !alreadyExists) {
    oldItems.push(newItem); 
}
  

Тогда, возможно, вам следует сделать концепцию более явной, инкапсулировав эту логику в ItemStore или что-то подобное.

 function ItemStore(items) {
    this._items = [];
    this._titleMap = {};

    this.addAll(items || []);
}

ItemStore.prototype = {
    constructor: ItemStore,

    hasItemTitled: function (title) {
        return !!this._titleMap[title];
    },

    add: function (item) {
        var title = item.title;

        if (this.hasItemTitled(title)) throw new Error("the store already contains an item titled '"   title   "'");
        this._titleMap[title] = true;
        this._items.push(item);
    },

    addAll: function (items) {
        items.forEach(this.add.bind(this));
    },

    items: function () { return this._items.slice(); }

    //other useful methods such as itemAt, remove...
};
  

Тогда ваш код становится таким простым, как…

   var titleInput=document.getElementById('titleName').value;
  var messageInput=document.getElementById('titleDesc').value;  
  var oldItems = new ItemStore(JSON.parse(localStorage.getItem('itemsArray')) || []);
  var newItem = {
      "title":titleInput ,
      "desc": messageInput
  };
  var shouldAddItem = titleInput != "" amp;amp; messageInput !="" amp;amp; !oldItems.hasItemTitled(newItem.title);

  if (shouldAddItem) oldItems.add(newItem);
  

Теперь очевидно, что ваша функция все еще выполняет слишком много, поскольку она:

  • знает, как извлекать и создавать новый элемент на основе введенных пользователем данных
  • знает, как повторно увлажнить хранилище элементов
  • знает, что нужно проверить, чтобы подтвердить, является ли элемент допустимым и должен быть добавлен или нет

Вы должны прочитать о принципе единой ответственности, который применим не только в OO.