题
我知道在 javascript 中对象兼作哈希,但我一直无法找到内置函数来获取密钥
var h = {a:'b',c:'d'};
我想要类似的东西
var k = h.keys() ; // k = ['a','c'];
自己编写一个函数来迭代项目并将键添加到我返回的数组中很简单,但是有没有一种标准的更干净的方法来做到这一点?
我一直觉得它一定是一个简单的内置函数,我错过了,但我找不到它!
解决方案
现代 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;
}
其他提示
对于需要与客户端浏览器具有较大兼容性的生产代码,我仍然建议 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.keys
Object.keys(h)
你可以使用 下划线.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 () ...
然而,当与谷歌地图 API v3 结合使用时,谷歌地图无法正常工作。
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 的一部分,我只想要键, this
是包含键的 hashmap 对象