Как найти ключи хеша? - PullRequest
       43

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

189 голосов
/ 21 августа 2008

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

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

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

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

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

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

Ответы [ 9 ]

271 голосов
/ 03 августа 2011

В современном 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;
}
80 голосов
/ 21 августа 2008

Для производственного кода, требующего большой совместимости с клиентскими браузерами, я все же предлагаю приведенный выше ответ Ивана Невоструева с shim для обеспечения 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 не было таким грязным.

40 голосов
/ 09 августа 2013

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

Object.keys(h)
33 голосов
/ 11 августа 2011

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

_.keys({one : 1, two : 2, three : 3}); 
// => ["one", "two", "three"]
13 голосов
/ 21 августа 2008

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

var keys = [];
for (var k in h)keys.push(k);
8 голосов
/ 15 февраля 2012

используя 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

6 голосов
/ 21 августа 2008

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

function getKeys(h) {
  Array keys = new Array();
  for (var key in h)
    keys.push(key);
  return keys;
}
4 голосов
/ 24 июля 2010

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

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

Однако при использовании вместе с API карт Google v3 карты Google не работают.

for (var key in h) ...

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

1 голос
/ 01 марта 2012

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

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

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