当前位置:  开发笔记 > 编程语言 > 正文

如何找到哈希的键?

如何解决《如何找到哈希的键?》经验,为你挑选了7个好方法。

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

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

我想要类似的东西

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

自己编写一个函数来迭代项目并将键添加到我返回的数组中是很简单的,但有没有一种标准的清洁方法呢?

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



1> Ivan Nevostr..:

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


据我所知,这个`Ob​​ject.prototype.keys`将使`keys`可用于Object的所有子类,因此对所有对象都可用.如果您正在尝试使用OOP,那可能是您想要的.无论如何,这实际上取决于您的要求.

2> Annan..:

对于需要与客户端浏览器具有较大兼容性的生产代码,我仍然建议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的原型并不那么混乱,我仍然认为这个答案是理想的.


'hasOwnProperty'排除了此对象原型的属性,这对于了解很有用.
请注意,您应该使用"for(var i in this)..."来避免创建全局变量.
我会避免修改Object.prototype - 作为下面提到的另一个评论者,这可以很容易地破坏不检查hasOwnProperty()的脚本.相反,使用较少OO友好的方式:定义'keys'函数(如果它尚不存在).(Firefox和Chrome都实现了一个本机keys()函数,它完全符合OP的要求 - IE不会)
答案被接受,因为这是我最终实现它的方式,但我觉得这应该是该语言的内置功能.

3> Leticia Sant..:

您可以使用 Object.keys

Object.keys(h)


在ECMAScript 5中添加,但现在应该可以在大多数主流浏览器中使用

4> 小智..:

您可以使用Underscore.js,它是一个Javascript实用程序库.

_.keys({one : 1, two : 2, three : 3}); 
// => ["one", "two", "three"]


这些天,我认为使用这些漂亮的小库比使用自己的实现更有帮助...无论如何,在大多数现实世界的项目中,我们总是使用Underscore或等效的库.就个人而言,我宁愿选择Underscore.

5> danb..:

据我所知,这是你能做的最好的......

var keys = [];
for (var k in h)keys.push(k);


最好使用它,而不是"弄乱"Object.prototype.如果我们向Object.prototype添加内容,似乎一切都会中断:它是一个非常常见的习惯用法循环遍历数组/对象的键.
当Object.prototype被搞乱时,这也不起作用.

6> chim..:

使用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


如果你想走这条路,你也可以使用`JQuery.map`:`$.map(h,function(v,k){return k;});`

7> palmsey..:

我相信你可以使用for/in遍历对象的属性,所以你可以这样做:

function getKeys(h) {
  Array keys = new Array();
  for (var key in h)
    keys.push(key);
  return keys;
}

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有