Длина ассоциативного массива JavaScript

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

var quesArr = new Array();
quesArr["q101"] = "Your name?";
quesArr["q102"] = "Your age?";
quesArr["q103"] = "Your school?";

Есть ли встроенная функция, которая могла бы получить длину этого массива, или решение в jQuery или другой библиотеке? В настоящее время quesArr.length дает 0, как должно быть известно большинству из вас.

Не предлагайте перебирать весь массив/объект, как указано в этом вопросе, потому что массив/объект, который у меня есть, очень большой.

Есть ли способ продолжить это?


person gopi1410    schedule 12.05.2012    source источник
comment
Я бы предложил вам перебрать весь объект, так как это единственный способ добиться этого. У вас есть объект (который был массивом до второй строки). У объекта нет длины, у массива есть.   -  person Fabien Ménager    schedule 12.05.2012


Ответы (4)


Нет, нет встроенного свойства, которое сообщает вам, сколько свойств имеет объект (это то, что вы ищете).

Самое близкое, что я могу придумать, это две функции ES5 и выше, Object.keys (spec | MDN) и Object.getOwnPropertyNames (spec | MDN). Например, вы можете использовать Object.keys следующим образом:

console.log(Object.keys(quesArr).length); // "3"

Object.keys возвращает массив имен собственных перечисляемых строковых свойств объекта. Но внутренне (теоретически) это тот цикл, который вы не хотели использовать (и полифилл для него для сред до ES5, конечно, использует цикл). Если вам также нужны неперечисляемые свойства со строковыми именами, вместо этого вы должны использовать Object.getOwnPropertyNames.

В ES2015+ объект может иметь свойства, ключи которых являются символами, а не строками. Object.getOwnPropertySymbols (spec | MDN) позволяет их получить.


FWIW, если вы не собираетесь использовать Array функции объекта, не делайте его массивом. Вместо:

var quesArr = {};
quesArr["q101"] = "Your name?";
quesArr["q102"] = "Your age?";
quesArr["q103"] = "Your school?";

Эти ключи также не должны быть указаны в виде строковых литералов в квадратных скобках, если вы не хотите, чтобы они были (независимо от того, используете ли вы массив или простой объект):

var quesArr = {};
quesArr.q101 = "Your name?";
quesArr.q102 = "Your age?";
quesArr.q103 = "Your school?";

Но вы можете использовать и другие обозначения, если хотите; они полностью эквивалентны, за исключением того, что в точечной нотации ключи должны быть действительными именами идентификаторов (в скобках они могут быть любыми).

Вы даже можете сделать это:

var quesArr = {
    q101: "Your name?",
    q102: "Your age?",
    q103: "Your school?"
};

или (если ключи не будут действительными идентификаторами):

var quesArr = {
    "q101": "Your name?",
    "q102": "Your age?",
    "q103": "Your school?"
};

Это могут быть одинарные или двойные кавычки.

person T.J. Crowder    schedule 12.05.2012
comment
ок, это новая информация для меня. а также я вижу, что невозможно узнать длину объекта, не перебирая его. В любом случае спасибо. :) - person gopi1410; 12.05.2012
comment
@gopi1410: О, кстати, каждый раз, когда вы обнаружите, что пишете new Array(), вы можете вместо этого использовать []. [] создает новый пустой массив точно так же, как {} создает новый пустой объект. - person T.J. Crowder; 12.05.2012

Предположим, у вас есть следующее,

var myObject = {};  // Denotes an Object is being created
myObject.city = "Chennai";
myObject.state = "Tamilnadu";
myObject.country = "Indian Peninsula";
console.log(myObject.length);  // Results in undefined

Но есть способ рассчитать длину в современных браузерах (Chrome, Firefox 4+ и Internet Explorer 9):

Object.keys(myObject);
// --> ["city", "state", "country"]
Object.keys(myObject).length
// --> 3
person kmario23    schedule 25.11.2014

Можно также решить проблему длины ассоциативных массивов, отслеживая длину массива с помощью ассоциативного элемента с именем length.

Известно как:

myArray["length"] = 0;

Когда вы добавляете или удаляете элементы, просто добавляйте или вычитайте из элемента myArray["length"].

Затем вы можете делать такие вещи, как:

theLength = myArray.length;
person user2256383    schedule 08.04.2013
comment
В случае OP их массив является фактическим массивом, а не простым объектом, поэтому он уже имеет свойство .length. Поэтому, если бы они выполнили какие-либо правильные операции с массивами (например, .push()), которые изменили бы длину... - person nnnnnn; 25.07.2016

Ассоциативный массив не имеет свойства длины, но вы можете получить длину.

person viveksharma    schedule 12.02.2017
comment
Пожалуйста, не публикуйте свой ответ в виде изображения — наш брандмауэр блокирует imgur. - person Andrew Smith; 05.06.2019