2009-02-03 2 views
3

Если у меня есть массив в Javascript, который был заполнен спорадически, как определить количество элементов, не содержащих ничего в массиве?Как определить количество определенных элементов в массиве?

, например:

var zipCodes = []; 
zipCodes[10006] = 'New York, NY'; 
zipCodes[90210] = 'Los Angeles, CA'; 

zipCodes.length возвращает 90,211 здесь, и я действительно не хочу, чтобы перебрать 90,209 бездельников, чтобы выяснить, у меня есть два действительных элементов. Использование цикла for-in означает обращение ко всему, что может вызвать пузырьки цепи прототипов и попытка выяснить, является ли это частью этого массива.

Есть ли какой-либо путь, учитывая массив, определенный выше, я могу извлечь «2» в качестве числа определенных элементов?

ответ

12

Вы должны были бы объект с пар ключ-значение (вроде как ассоциативный массив/хэш-таблицу) вместо массива:

var zipCodes = {}; 
zipCodes[10006] = 'New York, NY'; 
zipCodes[90210] = 'Los Angeles, CA'; 


for(var zipCode in zipCodes) { 
    if(zipCodes.hasOwnProperty(zipCode)) {//makes sure prototypes aren't taken into account 

    } 
} 

редактировать: или вы можете хранить объекты в массиве, как это:

var zipCodes = []; 
zipCodes.push({10006:'New York, NY'}); 
zipCodes.push({90210: 'Los Angeles, CA'}); 

//zipCodes.length = 2

+0

Я считаю, что у вас есть ваши скобки объекта/массива обращаются в объявлениях переменных. –

+0

+1 для первого подхода, -1-секундный подход мало смысла. Я бы не стал беспокоиться о бизнесе hasOwnProperty, если у вас есть код, который возится с прототипом базового объекта, избавиться от него pronto. – AnthonyWJones

+0

@AnthonyWJones, вы не всегда имеете полный контроль над кодом. Особенно, когда вы используете сторонние библиотеки, такие как MooTools или Prototype.js, поэтому я просто привык к этой проверке. Кроме того, ОП конкретно сказал, что цепочка прототипов будет проблемой. –

0

Можно также (в зависимости от большого разнообразия существующих неизвестных) заполнить второй массив, содержащий индексы (индексы?) заполненных записей в первом массиве.

Таким образом, вы могли бы иметь метод, который изменяет масштаб изображения по всему массиву один раз, заселение второго массива:

var indexesNext = 0; 
var indexes = new Array(); 
for(i = 0 ; i < zipCodes.length ; i++) 
    if(zipCodes[i] != null) indexes[indexesNext++] = i; 

Или вы можете использовать добавлять и удалять методы доступа на массиве Почтовых индексов обновить массив индексов, если вы «ожидая, что он изменится часто.

Или вы можете использовать метод sort() Javascript для массива и прокручивать его до тех пор, пока не нажмете пустую ячейку. Вы могли бы использовать это, чтобы оптимизировать предыдущие методы (YMMV по эффективности этого встроенного метода, но новые Javascript-двигатели в FFX 3.1 и Chrome, безусловно, будут хорошо работать, я уверен.)

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