Количество элементов в объекте javascript

Есть ли способ получить (откуда-то) количество элементов в объекте javascript? (т.е. постоянной продолжительности).

Я не могу найти свойство или метод, которые извлекают эту информацию. До сих пор я могу думать только о том, чтобы делать итерацию по всей коллекции, но это линейное время.
Странно, что нет прямого доступа к размеру объекта, как вы думаете.

EDIT:
Я говорю о объекте Object (а не вообще вообще):

var obj = new Object ;

Ответ 1

Хотя реализации JS могут отслеживать такое значение внутри, нет стандартного способа его получения.

В прошлом вариант Mozilla Javascript показывал нестандартный __count__, но был удален с версией 1.8.5.

Для кросс-браузерных скриптов вы застряли в явном повторении свойств и проверки hasOwnProperty():

function countProperties(obj) {
    var count = 0;

    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            ++count;
    }

    return count;
}

В случае совместимых с ECMAScript 5 реализаций это также можно записать как (Kudos to Avi Flax)

function countProperties(obj) {
    return Object.keys(obj).length;
}

Имейте в виду, что вы также пропустите свойства, которые не перечислены (например, массив length).

Если вы используете фреймворк, такой как jQuery, Prototype, Mootools, $any-the-newest-hype, проверьте, есть ли у них собственный API-интерфейс для коллекций, который может быть лучшим решением вашей проблемы, чем использование собственных объектов JS.

Ответ 2

Для этого в любой ES5-совместимой среде

Object.keys(obj).length

(Поддержка браузера здесь)
(Doc on Object.keys здесь, включает метод, который вы можете добавить в браузер, не поддерживающий ECMA5)

Ответ 3

если вы уже используете jQuery в своей сборке, просто выполните следующее:

$(yourObject).length

Он отлично работает для меня на объектах, и у меня уже был jQuery как зависимость.

Ответ 4

function count(){
    var c= 0;
    for(var p in this) if(this.hasOwnProperty(p))++c;
    return c;
}

var O={a: 1, b: 2, c: 3};

count.call(O);

Ответ 5

AFAIK, нет надежного способа сделать это, если вы не переключитесь на массив. Что, честно говоря, не кажется странным - мне кажется довольно прямым, что массивы являются счетными, а объекты - нет.

Вероятно, ближайший вы получите что-то вроде этого

// Monkey patching on purpose to make a point
Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this ) i++;
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 3

Но это создает проблемы или, по крайней мере, вопросы. Все пользовательские свойства учитываются, включая функцию _length! И хотя в этом простом примере вы могли бы избежать этого, просто используя обычную функцию, это не значит, что вы можете остановить другие скрипты от этого. так что ты делаешь? Игнорировать свойства функции?

Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this )
  {
      if ( 'function' == typeof this[p] ) continue;
      i++;
  }
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 2

В конце концов, я думаю, вы, вероятно, должны отказаться от идеи сделать ваши объекты счетными и выяснить другой способ сделать то, что вы делаете.

Ответ 6

Понятие числа/длины/размерности на самом деле не имеет смысла для объекта, и в нем требуется, чтобы вы действительно хотели, чтобы мне был нужен массив.

Изменить: указал мне, что для этого вам нужен O (1). Насколько я знаю, такой путь не существует. Я боюсь.

Ответ 7

Вы можете использовать:

({ foo:55, bar:99 }).__count__ // is: 2

был взят из здесь