关于javascript:如何查找哈希的键?

关于javascript:如何查找哈希的键?

How to find keys of a hash?

我知道在javascript对象中双重作为哈希,但我一直无法找到内置函数来获取密钥

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

我想要类似的东西

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

1
Object.keys(h)

您可以使用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
for (var key in h) ...

效果很好。


如果您只是尝试获取元素而不是函数,那么此代码可以帮助您

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对象


推荐阅读