Вы можете определенно использовать 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
, вы будете потреблять очень большой объем памяти.
Хотя это простой способ добавить функцию 'contains' и' remove' в 'Array.prototype', @JQuery Mobile ссылается на идею отклонения от цикла по массиву для ответа. Обе эти функции, которые вы предоставили цикл по массиву до тех пор, пока не будет найден соответствующий индекс. В этом отношении я считаю, что этот ответ следует пересмотреть, прежде чем он будет отмечен как принятый. – WebWanderer
Вы не должны перебирать массив с 'for..in'. – thefourtheye
Проще итерации массива с 'for..in', но я не уверен, что я вижу что-то не так с этим, кроме того, что он не чувствует себя хорошо. Единственное различие между использованием 'for..in', связанного с' for (i = 0; i <..; i ++) ', будет заключаться в том, что ваша ссылка на индекс будет в формате' String' вместо 'integer' – WebWanderer