我知道在javascript对象中,哈希值会倍增,但是我一直无法找到内置函数来获取密钥
var h = {a:'b',c:'d'};
我想要类似的东西
var k = h.keys() ; // k = ['a','c'];
自己编写一个函数来遍历所有项并将键添加到返回的数组中很简单,但是有没有一种更干净的标准方法呢?
我一直感觉它一定是我错过的一个简单的内置函数,但是我找不到它!
我知道在javascript对象中,哈希值会倍增,但是我一直无法找到内置函数来获取密钥
var h = {a:'b',c:'d'};
我想要类似的东西
var k = h.keys() ; // k = ['a','c'];
自己编写一个函数来遍历所有项并将键添加到返回的数组中很简单,但是有没有一种更干净的标准方法呢?
我一直感觉它一定是我错过的一个简单的内置函数,但是我找不到它!
Answers:
现代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;
}
if(!Object.prototype.keys) Object.prototype.keys = function() { if (this !== Object(this)) throw new TypeError('Object.keys called on non-object'); var ret = [], p; for (p in this) if (Object.prototype.hasOwnProperty.call(this, p)) ret.push(p); return ret; } var x = { a: { A: 1, B: 2, C: 3 }, b: { A: 10, B: 20 } }; alert(x.a.keys());
Object.prototype.keys
将keys
可用于Object的所有子类,因此可用于所有对象。如果您尝试使用OOP,可能会想要。无论如何,这实际上取决于您的要求。
对于需要与客户端浏览器高度兼容的生产代码,我仍然建议使用Ivan Nevostruev的上述答案,并使用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;
}
编辑:由于这个答案已经存在了一段时间,所以我将保持不变。阅读此书的任何人还应该阅读以下Ivan Nevostruev的答案。
没有办法使原型函数不可枚举,这导致它们总是出现在不使用的for-in循环中hasOwnProperty
。我仍然认为,如果扩展Object的原型不是那么混乱,那么这个答案将是理想的。
您可以使用Underscore.js,这是一个Javascript实用程序库。
_.keys({one : 1, two : 2, three : 3});
// => ["one", "two", "three"]
Object.prototype
_.keys(obj).length
看看是否有任何键。
使用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
JQuery.map
: $.map(h, function(v,k) { return k; });