#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.