如何找到哈希键?
时间:2020-03-05 18:41:18 来源:igfitidea点击:
我知道在javascript对象中,哈希值会倍增,但是我一直无法找到内置函数来获取密钥
var h = {a:'b',c:'d'};
我想要类似的东西
var k = h.keys() ; // k = ['a','c'];
自己编写一个函数以遍历所有项并将键添加到返回的数组中很简单,但是有没有一种标准的更干净的方法?
我一直感觉它一定是我错过的一个简单的内置函数,但是我找不到它!
解决方案
回答
据我所知,这是我们所能做的最好的...
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的答案与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的答案。
没有办法使原型函数不可枚举,这导致它们总是出现在不使用" hasOwnProperty"的for-in循环中。我仍然认为,如果扩展Object的原型不是那么混乱,那么这个答案将是理想的。
回答
我想使用上面评分最高的答案
Object.prototype.keys = function () ...
但是,当与google maps API v3结合使用时,google maps无法正常工作。
for (var key in h) ...
效果很好。