如何找到对象的键?

2022-08-30 01:24:30

我知道在JavaScript中,对象兼作哈希值,但我一直无法找到一个内置的函数来获取密钥:

var h = {a:'b', c:'d'};

我想要类似的东西

var k = h.keys() ; // k = ['a', 'c'];

自己编写一个函数来迭代项目并将键添加到我返回的数组中很简单,但是有没有标准的更清晰的方法可以做到这一点?

我一直觉得它一定是一个简单的内置功能,我错过了,但我找不到它!


答案 1

现代 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;
}

答案 2

对于需要与客户端浏览器高度兼容的生产代码,我仍然建议使用shim的Ivan Nevostruev的答案,以确保在较旧的浏览器中。但是,可以使用 ECMA 的新功能获得请求的确切功能。Object.keysdefineProperty

从 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在下面的答案。

没有办法使原型函数不可枚举,这导致它们总是出现在不使用 .我仍然认为,如果扩展Object的原型不是那么混乱,这个答案将是理想的。hasOwnProperty