У меня есть объект 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 и кольца. Существует ли "правильный путь" для получения количества полей в объекте?
Поправка: нужно проверять myObject.hasOwnProperty(key)
в каждой итерации, потому что могут быть унаследованные атрибуты. Например, если перед циклом сделать Object.prototype.test = 'test'
, то test
тоже будет засчитан.
Что касается вашего вопроса: вы можете просто определить вспомогательную функцию, если скорость не имеет значения. В конце концов, мы определяем хелперы для функции trim и других простых вещей. Многое в javascript "как бы халтурно и окольными путями" :)
update
Пример отказа, как и просили.
Object.prototype.test = 'test';
var x = {};
x['a'] = 1;
x['b'] = 2;
Возвращаемое число будет равно 3.
вы также можете просто выполнить myObject.length
(в массивах)
неважно, посмотрите это: Размер объекта JavaScript
В 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();
Это все, что вы можете сделать. Ясно, что объекты JavaScript не предназначены для этого. И это даст вам только количество Enumerable свойств. Попробуйте getObjectSize (Math)
.