我如何找到一个对象的键?

我知道在JavaScript中,对象双重哈希值,但我一直无法找到一个内置函数来获取键:

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

我想要这样的东西

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

我自己编写一个函数来迭代项目并将键添加到我返回的数组是很简单的,但是否有一种标准的更干净的方法来做到这一点?

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

205587 次浏览

据我所知,这是你能做的最好的了……

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

我相信你可以使用for/in循环遍历对象的属性,所以你可以这样做:

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

对于需要与客户端浏览器兼容的产品代码,我仍然建议Ivan Nevostruev的回答 with 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;
}

编辑:由于这个答案已经存在了一段时间,我将不动上面的内容。读到这篇文章的人也应该读读下面伊万·涅沃斯特鲁耶夫的回答。

没有办法使原型函数不可枚举,这导致它们总是出现在不使用hasOwnProperty的for-in循环中。我仍然认为这个答案是理想的,如果扩展Object的原型不是那么混乱的话。

我想使用AnnanFay的回答:

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

然而,当它与谷歌地图 API v3一起使用时,谷歌Maps是非功能性的。

然而,

for (var key in h) ...

工作得很好。

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

你可以使用Underscore.js,这是一个JavaScript实用程序库。

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

使用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。

如果你只想获取元素,而不是函数,那么这段代码可以帮助你:

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对象。

你可以使用Object.keys:

Object.keys(h)

在Javascript中我们可以使用

Object.keys(h)