2014-10-22 4 views
1

У меня есть массив символов JavaScript. Мой массив определяется следующим образом:Добавление и удаление значений из массива JavaScript

var customerIds = []; 

У меня есть функция, которая отвечает за вставку и удаление идентификаторов в/из этого массива. В принципе, моя функция выглядит так:

function addOrRemove(shouldAdd, customerId) { 
    if (shouldAdd) { 
    if (customerIds.contains(customerId) === false) { 
     customerIds.push(customerId); 
    } 
    } else { 
    customerIds.remove(customerId); 
    } 
} 

Эта функция в основном псевдокода. В массиве JavaScript нет функции соты или удаления. Мой вопрос в том, есть ли элегантный способ решения этой проблемы? Лучшее, что я могу придумать, - это всегда прокручивать массив и отслеживать индекс первого найденного элемента.

Благодарим вас за любые идеи, которые вы можете предоставить.

ответ

0

Вы можете расширить метод массива, как показано ниже после этого вы можете использовать «содержит» и «удалить»

if (!Array.contains) 
    Array.prototype.contains = function(a) { 
     for (var i in this) { 
      if (this[i] == a) return true; 
     } 
     return false 
    } 
if (!Array.remove) 
    Array.prototype.remove = function(a) { 
     for (var i in this) { 
      if (this[i] == a) { 
       this.splice(i, 1); 
      } 
     } 
    } 
+0

Хотя это простой способ добавить функцию 'contains' и' remove' в 'Array.prototype', @JQuery Mobile ссылается на идею отклонения от цикла по массиву для ответа. Обе эти функции, которые вы предоставили цикл по массиву до тех пор, пока не будет найден соответствующий индекс. В этом отношении я считаю, что этот ответ следует пересмотреть, прежде чем он будет отмечен как принятый. – WebWanderer

+0

Вы не должны перебирать массив с 'for..in'. – thefourtheye

+0

Проще итерации массива с 'for..in', но я не уверен, что я вижу что-то не так с этим, кроме того, что он не чувствует себя хорошо. Единственное различие между использованием 'for..in', связанного с' for (i = 0; i <..; i ++) ', будет заключаться в том, что ваша ссылка на индекс будет в формате' String' вместо 'integer' – WebWanderer

0

Использование indexOf и splice

function addOrRemove(shouldAdd, customerId) { 
    if (shouldAdd) { 
     if (customerIds.indexOf(customerId) == -1) { 
      customerIds.push(customerId); 
     } 
    } else { 
     var index = customerIds.indexOf(customerId) 
     customerIds.splice(index, 1); 
    } 
} 
1
  1. contains может быть достигнуто с Array.prototype.indexOf, как эта функция

    if (customerIds.indexOf(customerId) === -1) { 
    

    indexOf возвращает -1, если он не может найти параметр в array, в противном случае - первый индекс совпадения. Таким образом, если результатом является -1, это означает, что customerIdsне содержитcustomerId.

  2. remove может быть достигнуто с Array.prototype.indexOf и Array.prototype.splice, как этот

    var index = customerIds.indexOf(customerId); 
    if (index !== -1) { 
        customerIds.splice(index, 1); 
    } 
    

    Аналогично, функция возвращает indexOf-1, если он не может найти параметр в массиве, в противном случае первый индекс матча , Итак, если результат -1, мы пропускаем удаление, иначе splice1 элемент, начинающийся с позиции index.

0

Вы можете определенно использовать splice и indexOf как заявил @thefourtheye, но я хотел бы предложить другой подход.

Вместо использования array вы можете использовать object.

var customerIds = {}; 
//This could also be stated as: var customerIds = new Object(); this is just shorthand 

function addOrRemove(shouldAdd, customerId) 
{ 
    if(shouldAd) 
    { 
     if(!customerIds[customerId]) 
     { 
      customerIds[customerId] = new Object(); 
      customerIds[customerId].enabled = true; 
     } 
    } 
    else 
    { 
     if(customerIds[customerId]) 
     { 
      customerIds[customerId].enabled = false; 
     } 
    } 
} 

Теперь вы можете запросить против customerIds объекта для конкретного customerId

if(customerIds[customerId].enabled) 

Используя этот метод не только предоставляет вам с возможностью подключения нескольких атрибутов к данному customerId, но и позволяет вести учет всех customerIds после отключения (удаления).

К сожалению, для правильного удаления customerId вам необходимо пройти через объект и добавить каждое свойство объекта к новому объекту, кроме того, который вы не хотите. Функция будет выглядеть следующим образом:

function removeId(customerId) 
{ 
    var n_customerIds = new Object(); 

    for(var key in customerIds) 
    { 
     if(key != customerId) 
     { 
      n_customerIds[key] = customerIds[key]; 
     } 
    } 

    customerIds = n_customerIds; 
} 

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

Если вы хотите использовать этот метод, я бы только предложил делать так, если вы не собирать много customerIds и не хотите много customerData за каждый customerId, или, если вы собираете много customerIds и не хочу лот customerData за каждый customerId. Если вы храните много customerData для большого количества customerIds, вы будете потреблять очень большой объем памяти.

Смежные вопросы