2008-08-20 3 views
178

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

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

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

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

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

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

+0

I Я просто вскакиваю в javascript, но этот пост может вам помочь. http://dean.edwards.name/weblog/2006/07/enum/ – 2008-08-20 21:47:42

+0

Возможный дубликат [Получить массив ключей объекта] (http://stackoverflow.com/questions/8763125/get-array-of-objects- ключи) – blo0p3r 2016-02-02 13:48:01

+1

Как получить значения из ключей? Кроме того, количество ключей в хеше. – 2016-05-10 19:52:29

ответ

249

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

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

детали совместимости можно найти here.

На Mozilla site есть также отрезала для обратной совместимости:

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; 
} 
13

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

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

Это также не работает, когда Object.prototype запутан. – Phil 2011-07-26 08:40:14

+4

Было бы лучше использовать это, а не «возиться с» Object.prototype. Кажется, что все ломается, если мы добавляем вещи в Object.prototype: это чрезвычайно распространенная идиома, которая перебирает ключи массива/объекта. – 2012-05-07 07:59:30

6

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

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

Это не работает, см. Ответ Аннан – Phil 2011-07-26 08:39:16

79

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

По состоянию на ECMAScript 5 - Object.defineProperty

По ECMA5 вы можете использовать Object.defineProperty() определить несчетное свойство. current compatibility по-прежнему требует многого, но в конечном итоге это должно стать удобным во всех браузерах. (В частности, обратите внимание на текущую несовместимость с 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 не было настолько грязным.

+9

«hasOwnProperty» исключает свойства прототипов этого объекта, что полезно знать. – ijw 2009-11-13 11:09:58

4

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

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

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

for (var key in h) ... 

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

34

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

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

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

1

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

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

38

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

Object.keys(h) 
Смежные вопросы