2010-03-08 4 views
6

Я использую яваскрипт ассоциативного массив как:Javascript длина ассоциативного массива с помощью JQuery

var testarray = []; 
testarray['one'] = '1'; 
testarray['two'] = '2'; 
testarray['three'] = '3'; 

Я также использую JQuery вместе. Как проверить длину этого ассоциативного массива с помощью jquery или любого другого метода? В основном я хочу проверить, пуст ли этот массив или нет.

спасибо.

+1

дубликатов; хороший ответ @ http://stackoverflow.com/questions/5223/length-of-javascript-associative-array –

+1

У JavaScript нет «ассоциативных массивов», у него есть «массивы» и «объекты». Если вы хотите использовать именованные свойства, используйте простой объект ('{}'), а не массив. – Quentin

+0

@David: семантическая точка, но я бы сказал это наоборот: ** Все ** Объекты JavaScript - это ассоциативные массивы (а не только тип 'Array', хотя, конечно же, это тоже). У них есть строковые ключи, которые можно перечислить, записи, которые можно добавлять и удалять ('delete') ad hoc и т. Д. (Согласен, что если вы не используете числовые индексы, вы не хотите использовать' Array' .) –

ответ

9

Нет прямого вызова «длины» или «размера», вы должны проверить ключи, доступные внутри объекта.

Обратите внимание, что все JavaScript объекты ассоциативные массивы (карты), так что ваш код, вероятно, будет лучше использовать общий объект, а не массив:

var testarray = {}; // <= only change is here 
testarray['one'] = '1'; 
testarray['two'] = '2'; 
testarray['three'] = '3'; 

Вы можете узнать, какие ключи в объекте с помощью for..in:

var name; 
for (name in testarray) { 
    // name will be 'one', then 'two', then 'three' (in no guaranteed order) 
} 

... с помощью которого можно построить функцию, чтобы проверить, является ли пустой объект.

function isEmpty(obj) { 
    var name; 
    for (name in obj) { 
     return false; 
    } 
    return true; 
} 

Как CMS помечено в своем ответе, который будет идти через все ключи, включая ключи на прототип объекта. Если вы хотите только клавиши на объекте, а не его прототип, использовать встроенный в hasOwnProperty функции:

function isEmpty(obj) { 
    var name; 
    for (name in obj) { 
     if (obj.hasOwnProperty(name)) { 
      return false; 
     } 
    } 
    return true; 
} 
+4

А также не забывайте о 'hasOwnProperty()', чтобы не считать свойства прототипа. – MBO

+1

, вероятно, должен использовать трюк «hasOwnProperty», о чем бы я не знал, если бы я не стал зависимым от stackoverflow :-) – Pointy

+0

@MBO, Pointy и (косвенно) CMS: Совершенно верно, добавлено! –

19

Вы не должны использовать массив для хранения без числовых индексов, вы должны использовать простой объект:

function getObjectLength (o) { 
    var length = 0; 

    for (var i in o) { 
    if (Object.prototype.hasOwnProperty.call(o, i)){ 
     length++; 
    } 
    } 
    return length; 
} 

Edit: Поскольку вы используете JQuery, и вы хотите, чтобы проверить, является ли объект «пустой», версия 1.4 введена $.isEmptyObject

if ($.isEmptyObject(obj)) { 
    //... 
} 
+0

ooh Мне нравится, что вы получаете «hasOwnProperty» из прототипа Object :-) – Pointy

+0

Вы не должны использовать массив для хранения * только * нечисловых индексов (как я сказал в своем ответе), но я не вижу никаких выдает * также * хранение нечисловой информации о массивах, которые вы используете для их «нормальной» цели. –

+0

Почему бы не использовать 'hasOwnProperty' на' o' сам? Чтобы избежать его замены? –

0

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

var testNotArray = { }; 
testNotArray['one'] = 'something'; 
// ... 

Теперь это опасно по своей природе, но первый шаг может быть:

function objectSize(o) { 
    var c = 0; 
    for (var k in o) 
    if (o.hasOwnProperty(k)) ++c; 
    return c; 
} 

Опять , существует миллион странных способов преодоления такого подхода.

0

Вы можете вычислить длину, как показано ниже:

var testarray = {}; // Use a generic object to store non-numeric indexes not an array 
testarray['one'] = '1'; 
testarray['two'] = '2'; 
testarray['three'] = '3'; 
var count = 0 
for each(key in testarray) 
count = count + 1 
alert(count); // count contains the number of items in the array 
0

Вы можете перебрать свойства сосчитать:

var cnt = 0; 
for (i in testarray) cnt++; 
alert(cnt); 

Обратите внимание, что for (... in ...) также элементы цикла добавлен прототип, так вы можете захотеть засчитывать только те товары, которые были добавлены после этого:

var cnt = 0; 
for (i in testarray) if (testarray.hasOwnProperty(i)) cnt++; 
alert(cnt); 

Если вы просто хотите, чтобы проверить, есть ли какое-либо свойство, вы можете выйти из цикла после первого пункта:

var empty = true; 
for (i in testarray) if (testarray.hasOwnProperty(i)) { empty = false; break; } 
alert(empty); 
1

У меня был эта проблема тоже, и я просто понял, что решение (и протестировал его в браузере) :

//given: ass_arr, an associative array 
//result: count now holds the "length" of ass_arr 
var count = 0; 
$.each(ass_arr, function(key, val) { count+=1; }); 
alert(count); //number of iterable attributes in ass_arr 

Дайте мне знать, если это сработает для вас! Я пишу это прямо в мой код, как это:

var devices = STATUS.devices, 
    num_devices = 0; 
$.each(devices, function(id, device) { num_devices+=1; }); 
//num_devices set to number of devices 
12

Это дает вам длину вашего ассоциативного массива:

Object.keys(testarray).length