我知道在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使用垫片来解决上述问题,以确保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的原型并不那么混乱,我仍然认为这个答案是理想的.
您可以使用 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; }