Определите, сколько полей объект JavaScript имеет

У меня есть объект JavaScript, который я пытаюсь использовать в качестве "hashmap". Ключи всегда являются строками, таким образом, я не думаю, что мне нужно что-либо столь же сложное как что описано в этом ТАК вопрос. (Я также не ожидаю, что количество ключей выйдет за предел приблизительно 10, таким образом, я не буду особенно обеспокоен поисками, являющимися O (n) по сравнению с O (зарегистрируйте n) и т.д.),

Единственная функциональность я хочу тот встроенный JavaScript объекты, кажется, не имеет, быстрый способ выяснить количество пар ключ/значение в объекте, как то, что возвращает Map.size Java. Конечно, Вы могли просто сделать что-то как:

function getObjectSize(myObject) {
  var count=0
  for (var key in myObject)
    count++
  return count
}

но это кажется видом hacky и кольца. Существует ли "правильный путь" для получения количества полей в объекте?

11
задан Community 23 May 2017 в 12:32
поделиться

4 ответа

Поправка: нужно проверять myObject.hasOwnProperty(key) в каждой итерации, потому что могут быть унаследованные атрибуты. Например, если перед циклом сделать Object.prototype.test = 'test', то test тоже будет засчитан.

Что касается вашего вопроса: вы можете просто определить вспомогательную функцию, если скорость не имеет значения. В конце концов, мы определяем хелперы для функции trim и других простых вещей. Многое в javascript "как бы халтурно и окольными путями" :)

update
Пример отказа, как и просили.

Object.prototype.test = 'test';
var x = {};
x['a'] = 1;
x['b'] = 2;

Возвращаемое число будет равно 3.

3
ответ дан 3 December 2019 в 07:10
поделиться

вы также можете просто выполнить myObject.length (в массивах)

неважно, посмотрите это: Размер объекта JavaScript

0
ответ дан 3 December 2019 в 07:10
поделиться

В ECMAScript 5 указан более простой способ.

Object.keys(...) возвращает массив всех ключей, определенных для объекта. По нему можно вызвать функцию Length. Попробуйте в Chrome:

Object.keys({a: 1, b: 2}).length; // 2

Обратите внимание, что в JavaScript все объекты по сути являются парами ключ/значение, и они также очень расширяемы. Вы могли бы расширить Object.prototype методом size и получить количество там. Однако гораздо лучшим решением будет создание интерфейса типа HashMap или использование одной из многих существующих реализаций, и определение size на нем. Вот одна маленькая реализация:

function HashMap() {}

HashMap.prototype.put = function(key, value) {
    this[key] = value;
};

HashMap.prototype.get = function(key) {
    if(typeof this[key] == 'undefined') {
        throw new ReferenceError("key is undefined");
    }
    return this[key];
};

HashMap.prototype.size = function() {
    var count = 0;

    for(var prop in this) {
        // hasOwnProperty check is important because 
        // we don't want to count properties on the prototype chain
        // such as "get", "put", "size", or others.
        if(this.hasOwnProperty(prop) {
            count++;
        }
    }

    return count;
};

Используйте как (пример):

var map = new HashMap();
map.put(someKey, someValue);
map.size();
14
ответ дан 3 December 2019 в 07:10
поделиться

Это все, что вы можете сделать. Ясно, что объекты JavaScript не предназначены для этого. И это даст вам только количество Enumerable свойств. Попробуйте getObjectSize (Math) .

0
ответ дан 3 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

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