如何find一个哈希键?

我知道JavaScript的对象双哈希,但我一直无法find一个内置的函数来获取密钥

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

我想要类似的东西

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

自己编写一个函数来遍历这些项并向我返回的数组添加键是很简单的,但是有没有一个标准的更简洁的方法来实现呢?

我一直觉得它一定是一个简单的内置function,我错过了,但我找不到它!

在现代JavaScript(ECMAScript 5)中有一个名为Object.keys函数来执行这个操作:

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

兼容性细节可以在这里find。

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

对于需要与客户端浏览器有很大兼容性的产品代码,我仍然build议Ivan Nevostruev的回答是用shim来确保在旧浏览器中的Object.keys 。 但是,使用ECMA的新的definePropertyfunction可以获得所需的确切function。

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

编辑:由于这个答案已经有一段时间了,我将保持上述不变。 任何读这个的人都应该读下面的Ivan Nevostruev的回答。

没有办法使原型函数不可枚举,导致它们总是出现在不使用hasOwnProperty的for-in循环中。 如果扩展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地图是不起作用的。

 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实现的一部分,我只想要的键,“这个”是包含键的哈希映射对象