Я знаю, в javascript объекты удваиваются как хэши, но я не смог найти встроенную функцию для получения ключей
var h = {a:'b',c:'d'};
Я хочу что-то вроде
var k = h.keys() ; // k = ['a','c'];
Легко написать саму функцию для перебора элементов и добавления ключей в массив, который я возвращаю, но есть ли стандартный более чистый способ сделать это?
Я продолжаю чувствовать, что это должна быть простая встроенная функция, которую я пропустил, но я не могу ее найти!
javascript
object
key
похлопывание
источник
источник
Ответы:
В современном JavaScript (ECMAScript 5) есть функция, которая
Object.keys
выполняет эту операцию:Подробности о совместимости можно найти здесь .
На сайте Mozilla также есть фрагмент обратной совместимости:
источник
if(!Object.prototype.keys) Object.prototype.keys = function() { if (this !== Object(this)) throw new TypeError('Object.keys called on non-object'); var ret = [], p; for (p in this) if (Object.prototype.hasOwnProperty.call(this, p)) ret.push(p); return ret; } var x = { a: { A: 1, B: 2, C: 3 }, b: { A: 10, B: 20 } }; alert(x.a.keys());
Object.prototype.keys
сделаетkeys
доступным для всех подклассов объекта, следовательно, для всех объектов. Что, вероятно, вы хотите, если вы пытаетесь использовать ООП. В любом случае это действительно зависит от ваших требований.Для производственного кода, требующего большой совместимости с клиентскими браузерами, я все же предлагаю ответ Ивана Невоструева, приведенный выше, с шимом, чтобы убедиться
Object.keys
в старых браузерах. Тем не менее, можно получить точную функциональность, запрошенную с помощью новойdefineProperty
функции ECMA .Начиная с ECMAScript 5 - Object.defineProperty
Начиная с ECMA5 вы можете использовать
Object.defineProperty()
для определения не перечисляемых свойств. Тока совместимость до сих пор желать лучшего, но это должно в конечном итоге стать полезной во всех браузерах. (Обратите особое внимание на текущую несовместимость с IE8!)Однако, так как ECMA5 уже добавлен,
Object.keys
вы также можете использовать:Оригинальный ответ
Изменить: так как этот ответ был вокруг некоторое время, я оставлю вышеизложенное нетронутым. Любой, кто читает это, должен также прочитать ответ Ивана Невоструева ниже.
Нет никакого способа сделать функции-прототипы не перечисляемыми, что приводит к их постоянному включению в циклы for-in, которые не используются
hasOwnProperty
. Я все еще думаю, что этот ответ был бы идеальным, если бы расширение прототипа Object не было таким грязным.источник
ты можешь использовать
Object.keys
источник
Вы можете использовать Underscore.js , который является утилитарной библиотекой Javascript.
источник
Object.prototype
_.keys(obj).length
чтобы увидеть, есть ли какие-либо ключи.Это лучшее, что вы можете сделать, насколько я знаю ...
источник
используя jQuery, вы можете получить ключи следующим образом:
Или:
благодаря @pimlottc
источник
JQuery.map
:$.map(h, function(v,k) { return k; });
Я считаю, что вы можете просмотреть свойства объекта с помощью for / in, чтобы вы могли сделать что-то вроде этого:
источник
Я хотел использовать ответ с самым высоким рейтингом выше
Однако при использовании вместе с API карт Google v3 карты Google не работают.
работает хорошо.
источник
если вы пытаетесь получить только элементы, но не функции, тогда этот код может помочь вам
}
это часть моей реализации HashMap, и я хочу только ключи,
this
это объект hashmap, который содержит ключиисточник