У меня есть массив элементов (terms)
, которые будут введены в <option>
тегах в <select>
Если какие-либо из этих элементов находятся в другом массиве (termsAlreadyTaking
), они должны быть удалены первым Вот как я сделал это:..Лучший способ увидеть, содержит ли массив объект?
// If the user has a term like "Fall 2010" already selected, we don't need that in the list of terms to add.
for (var i = 0; i < terms.length; i++)
{
for (var iAlreadyTaking = 0; iAlreadyTaking < termsAlreadyTaking.length; iAlreadyTaking++)
{
if (terms[i]['pk'] == termsAlreadyTaking[iAlreadyTaking]['pk'])
{
terms.splice(i, 1); // remove terms[i] without leaving a hole in the array
continue;
}
}
}
есть ли лучший способ сделать это? он чувствует себя немного неуклюжим.
Я использую JQuery, если это делает разницу.
UPDATE на основании ответа @Matthew Flaschen в :
// If the user has a term like "Fall 2010" already selected, we don't need that in the list of terms to add.
var options_for_selector = $.grep(all_possible_choices, function(elem)
{
var already_chosen = false;
$.each(response_chosen_items, function(index, chosen_elem)
{
if (chosen_elem['pk'] == elem['pk'])
{
already_chosen = true;
return;
}
});
return ! already_chosen;
});
Причина становится немного более многословным в середине, что $.inArray()
возвращается ложь, потому что дубли я ищу не строго равны друг другу в ==
смысле. Однако все их значения одинаковы. Могу ли я сделать это более кратким?
'splice' не совсем быстро. Возможно, было бы лучше добавить выбранные элементы в новый массив, а не удалить остальную часть из оригинала. – casablanca