Определите, сколько полей имеет объект Javascript - PullRequest
10 голосов
/ 01 июля 2010

У меня есть объект Javascript, который я пытаюсь использовать как «hashmap». Ключи всегда являются строками, поэтому я не думаю, что мне нужно что-то более сложное, чем то, что описано в этом вопросе . (Я также не ожидаю, что количество ключей превысит 10, поэтому я не особенно обеспокоен поисками O (n) и O (log n) и т. Д.)

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

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

но это похоже на хакерство и окольность. Есть ли "правильный способ" получить количество полей в объекте?

Ответы [ 4 ]

14 голосов
/ 01 июля 2010

Существует более простой способ спецификации в ECMAScript 5.

Object.keys(..) возвращает массив всех ключей, определенных для объекта. Длина может быть названа на этом. Попробуйте в 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();
3 голосов
/ 01 июля 2010

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

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

обновление
Пример сбоя, согласно запросу.

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

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

0 голосов
/ 01 июля 2010

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

0 голосов
/ 01 июля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...