Число элементов в объекте JavaScript

Проверьте ваш главный диалог настроек для страниц с тегами задач. Введите «задача» в поле поиска в верхнем левом углу диалогового окна, чтобы помочь вам найти соответствующие страницы. Для файлов XML я знаю, что эта функция по умолчанию отключена.

98
задан GetFree 29 March 2013 в 21:49
поделиться

4 ответа

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

Раньше вариант Javascript Mozilla предоставлял нестандартный __ 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, это также можно записать как (Престижность Avi Flax )

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

Keep помните, что вы также пропустите свойства, которые нельзя перечислить (например, длина массива ).

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

148
ответ дан 24 November 2019 в 05:10
поделиться
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
ответ дан 24 November 2019 в 05:10
поделиться

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

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

2
ответ дан 24 November 2019 в 05:10
поделиться

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

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

1
ответ дан 24 November 2019 в 05:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: