如何找到哈希键?

时间: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) ...

效果很好。