我知道在javascript对象中双重作为哈希,但我一直无法找到内置函数来获取密钥
我想要类似的东西
1
| var k = h.keys() ; // k = ['a','c']; |
自己编写一个函数来迭代项目并将键添加到我返回的数组中很简单,但有没有一种标准的清洁方法呢?
我一直觉得它必须是一个简单的内置功能,我错过了,但我找不到它!
现代JavaScript(ECMAScript 5)中有一个名为Object.keys的函数执行此操作:
1 2
| var obj = {"a" : 1,"b" : 2,"c" : 3};
alert(Object.keys(obj)); // will output ["a","b","c"] |
兼容性详细信息可在此处找到。
在Mozilla网站上还有一个向后兼容的片段:
1 2 3 4 5 6 7
| 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的答案来确保旧版浏览器中的Object.keys。但是,可以使用ECMA的新defineProperty功能获得所需的确切功能。
截至ECMAScript 5 - Object.defineProperty
从ECMA5开始,您可以使用Object.defineProperty()来定义不可枚举的属性。目前的兼容性还有很多不足之处,但最终应该可以在所有浏览器中使用。 (特别注意当前与IE8不兼容!)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| 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,您可以使用:
1 2 3 4 5 6
| Object.defineProperty(Object.prototype, 'keys', {
value: function keys() {
return Object.keys(this);
},
enumerable: false
}); |
原始答案
1 2 3 4 5 6 7 8 9
| 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
您可以使用Underscore.js,它是一个Javascript实用程序库。
1 2
| _.keys({one : 1, two : 2, three : 3});
// => ["one","two","three"] |
据我所知,这是你能做的最好的......
1 2
| var keys = [];
for (var k in h)keys.push(k); |
使用jQuery你可以得到这样的键:
1 2 3 4
| var bobject = {primary:"red",bg:"maroon",hilite:"green"};
var keys = [];
$.each(bobject, function(key,val){ keys.push(key); });
console.log(keys); // ["primary","bg","hilite"] |
要么:
1 2
| var bobject = {primary:"red",bg:"maroon",hilite:"green"};
$.map(bobject, function(v,k){return k;}); |
感谢@pimlottc
我相信你可以使用for / in遍历对象的属性,所以你可以这样做:
1 2 3 4 5 6
| function getKeys(h) {
Array keys = new Array();
for (var key in h)
keys.push(key);
return keys;
} |
我想使用上面评价最高的答案
1
| Object.prototype.keys = function () ... |
但是,当与Google Maps API v3结合使用时,Google地图无法使用。
效果很好。
如果您只是尝试获取元素而不是函数,那么此代码可以帮助您
1 2 3 4 5 6 7 8 9 10 11
| 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对象