2016-09-05 4 views
0

Я хотел бы добавить объект в массив, если он еще не существует и удалить его, если он уже существует в массиве. Мне удалось добавить первый элемент, но он не работает, если я добавлю другой объект в массив. Я могу удалить первый элемент. Есть ошибка, я не знаю почему.Добавить или удалить элемент в массиве

Вот мой код:

function checkAmi(pseudo, id) { 
    var info = ({ 
     pseudo: pseudo, 
     id: id 
    }); 
    if (amisNotifies.length > 0) { 
     // iterate over each element in the array 
     for (var i = 0; i < amisNotifies.length; i++) { 
      console.log(angular.toJson(amisNotifies[i].pseudo)); 
      // look for the entry with a matching `code` value 
      if (amisNotifies[i].pseudo === pseudo) { 
       amisNotifies.removeValue('pseudo', pseudo); 
       $("#checkAmi" + id).addClass("fa-circle-o"); 
       $("#checkAmi" + id).removeClass("fa-check-circle-o"); 
      } else { 
       amisNotifies.push(info); 
       $("#checkAmi" + id).removeClass("fa-circle-o"); 
       $("#checkAmi" + id).addClass("fa-check-circle-o"); 
      } 
     } 
    } else { 
     amisNotifies.push(info); 
     $("#checkAmi" + id).removeClass("fa-circle-o"); 
     $("#checkAmi" + id).addClass("fa-check-circle-o"); 
    } 
} 
+0

Что такое 'amisNotifies'? Что такое 'removeValue'? – Tomalak

+0

amisNotifies = []; removeValue - это функция, которая удаляет значение объекта pseudo – DionysoSong

+0

В стандартных массивах JS нет функции, называемой 'removeValue'. – Tomalak

ответ

1

вы ошибочно проверяете дублирование, просто сравнивая все элементы с pseudo. вам нужно просмотреть все элементы, чтобы увидеть, соответствует ли он любому, а затем выполнить добавление/удаление на основе соответствия. следующий код будет работать для вас.

function checkAmi(pseudo, id) { 
    var info = ({ 
     pseudo: pseudo, 
     id: id 
    }); 
    var getIndexOf = function (psdu) { 
     for (var i = 0; i < amisNotifies.length; i++) { 
      if (amisNotifies[i].pseudo === psdu) { 
       return i; 
      } 
     } 

     return -1; 
    }; 

    if (amisNotifies.length > 0) { 
     var index = getIndexOf(pseudo); 
     if (index > -1) { 
      //so already exists. now remove it. 
      Array.prototype.splice.call(amisNotifies, index, 1); 
      $("#checkAmi" + id).addClass("fa-circle-o"); 
      $("#checkAmi" + id).removeClass("fa-check-circle-o"); 
     } 
     else { 
      //does not exist, now add it 
      amisNotifies.push(info); 
      $("#checkAmi" + id).removeClass("fa-circle-o"); 
      $("#checkAmi" + id).addClass("fa-check-circle-o"); 
     } 

    } else { 
     amisNotifies.push(info); 
     $("#checkAmi" + id).removeClass("fa-circle-o"); 
     $("#checkAmi" + id).addClass("fa-check-circle-o"); 
    } 
} 
+0

работает очень хорошо! – DionysoSong

1

предопределённые pop и shift методы удаления с обоих концов.

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

function removeElementAtIndex(arr, i) { 
    Array.prototype.splice.call(arr, i, 1); 
} 

Как сказать, является ли элемент вмассив зависит от того, что вы имеете в виду "в".

indexOf довольно хорошо, но есть угловой случай: [NaN].indexOf(NaN) является -1 потому NaN !== NaN.

Предполагая, что вы не беспокоитесь о NaN, вы могли бы сделать

function togglePresent(arr, el) { 
    var idx = arr.indexOf(el); 
    if (idx >= 0) { 
    arr.splice(idx, 1); 
    } else { 
    arr.push(el); 
    } 
} 

и если вы делаете уход, вы можете попробовать различные стратегии пересчитывать idx когда isNaN(el).

Примечание: это удаляет только один экземпляр el в arr.

+0

Но я положил console.log, чтобы проверить его, он идет до нажатия цикла для. Это не толкает новую информацию – DionysoSong

+0

@guillaumekotarba, как вы ее регистрируете? Когда вы передаете объект в консоль.log' вместо строки, это может задержать преобразование его в строку, что означает, что сообщение журнала не может представлять состояние сообщения в момент вызова 'console.log'. –

1

Ваша логика не кажется правильной - скажем, у вас есть 2 элемента в amiNotifies, и вы хотите добавить третье новое значение - при первом запуске цикла цикла (i = 0) он добавит элемент (псевдо), во второй раз (i = 1) он удалит добавленный элемент (псевдо), и в конечном итоге новый элемент не будет добавлен, вы должны переработать логику добавления и удаления на основе существования в amiNotify.

Возможно, вы используете операцию splice, чтобы удалить значения из amiNotifies.