Как найти ключи от хэша?

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

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

Мне нужно что-то вроде

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

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

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

Ответ 1

В современном 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;
}

Ответ 2

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

В соответствии с 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 не было настолько грязным.

Ответ 3

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

Object.keys(h)

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

с помощью 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

Ответ 7

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

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

Ответ 8

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

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

Однако при использовании в сочетании с API-интерфейсом google maps v3 карты google не работают.

for (var key in h) ...

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

Ответ 9

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

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, содержащий ключи