Вопрос

Я знаю, что в javascript объекты удваиваются как хэши, но мне не удалось найти встроенную функцию для получения ключей

var h = {a:'b',c:'d'};

Я хочу что-то вроде

var k = h.keys() ; // k = ['a','c'];

Просто самому написать функцию для перебора элементов и добавления ключей в возвращаемый мной массив, но есть ли стандартный более чистый способ сделать это?

Я продолжаю чувствовать, что это должна быть простая встроенная функция, которую я пропустил, но я не могу ее найти!

Это было полезно?

Решение

В современном JavaScript (ECMAScript 5) есть функция, вызываемая Object.keys выполнение этой операции:

var obj = { "a" : 1, "b" : 2, "c" : 3};
alert(Object.keys(obj)); // will output ["a", "b", "c"]

Подробную информацию о совместимости можно найти здесь.

На Сайт Mozilla существует также фрагмент для обеспечения обратной совместимости:

if(!Object.keys) Object.keys = function(o){
   if (o !== Object(o))
      throw new TypeError('Object.keys called on non-object');
   var ret=[],p;
   for(p in o) if(Object.prototype.hasOwnProperty.call(o,p)) ret.push(p);
   return ret;
}

Другие советы

Для производственного кода, требующего большой совместимости с клиентскими браузерами, я по-прежнему предлагаю приведенный выше ответ Ивана Невоструева с прокладкой, чтобы обеспечить Object.keys в старых браузерах.Тем не менее, можно получить точную запрошенную функциональность, используя новую версию ECMA defineProperty особенность.

Начиная с ECMAScript 5 - Object.defineProperty

Начиная с ECMA5, вы можете использовать Object.defineProperty() для определения неперечисляемых свойств.Тот Самый текущая совместимость все еще оставляет желать лучшего, но со временем это должно стать доступным во всех браузерах.(Особо обратите внимание на текущую несовместимость с IE8!)

Object.defineProperty(Object.prototype, 'keys', {
  value: function keys() {
    var keys = [];
    for(var i in this) if (this.hasOwnProperty(i)) {
      keys.push(i);
    }
    return keys;
  },
  enumerable: false
});

var o = {
    'a': 1,
    'b': 2
}

for (var k in o) {
    console.log(k, o[k])
}

console.log(o.keys())

# OUTPUT
# > a 1
# > b 2
# > ["a", "b"]

Однако, поскольку ECMA5 уже добавлен Object.keys с таким же успехом вы могли бы использовать:

Object.defineProperty(Object.prototype, 'keys', {
  value: function keys() {
    return Object.keys(this);
  },
  enumerable: false
});

Оригинальный ответ

Object.prototype.keys = function ()
{
  var keys = [];
  for(var i in this) if (this.hasOwnProperty(i))
  {
    keys.push(i);
  }
  return keys;
}

Редактировать: Поскольку этот ответ существует уже некоторое время, я оставлю вышесказанное нетронутым.Любой, кто читает это, должен также прочитать ответ Ивана Невоструева ниже.

Нет способа сделать прототипы функций неперечисляемыми, что приводит к тому, что они всегда появляются в циклах for-in, которые не используют hasOwnProperty.Я все еще думаю, что этот ответ был бы идеальным, если бы расширение прототипа Object не было таким беспорядочным.

вы можете использовать Object.keys

Object.keys(h)

Вы могли бы использовать Underscore.js, которая представляет собой библиотеку утилит Javascript.

_.keys({one : 1, two : 2, three : 3}); 
// => ["one", "two", "three"]

Это лучшее, что ты можешь сделать, насколько я знаю...

var keys = [];
for (var k in h)keys.push(k);

используя jQuery вы можете получить ключи вот так:

var bobject =  {primary:"red",bg:"maroon",hilite:"green"};
var keys = [];
$.each(bobject, function(key,val){ keys.push(key); });
console.log(keys); // ["primary", "bg", "hilite"]

Или:

var bobject =  {primary:"red",bg:"maroon",hilite:"green"};
$.map(bobject, function(v,k){return k;});

спасибо @pimlottc

Я полагаю, что вы можете перебирать свойства объекта, используя for / in, так что вы могли бы сделать что-то вроде этого:

function getKeys(h) {
  Array keys = new Array();
  for (var key in h)
    keys.push(key);
  return keys;
}

Я хотел использовать приведенный выше ответ с самым высоким рейтингом

Object.prototype.keys = function () ...

Однако при использовании в сочетании с Google Maps API v3 Google Maps нефункциональен.

for (var key in h) ...

работает хорошо.

если вы пытаетесь получить только элементы, но не функции, то этот код может вам помочь

this.getKeys = function() {

var keys = new Array();
for(var key in this) {

    if( typeof this[key] !== 'function') {

        keys.push(key);
    }
}
return keys;

}

это часть моей реализации HashMap, и мне нужны только ключи, this является объектом hashmap, который содержит ключи

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top