簡體   English   中英

如何找到對象的鍵?

[英]How can I find the keys of an object?

我知道在 JavaScript 中,對象兼作哈希,但我一直無法找到一個內置函數來獲取密鑰:

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

我想要類似的東西

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

自己編寫一個函數來迭代項目並將鍵添加到我返回的數組中很簡單,但是有沒有一種標准的更簡潔的方法來做到這一點?

我一直覺得它一定是一個我錯過但我找不到的簡單內置函數!

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

對於需要與客戶端瀏覽器具有很大兼容性的生產代碼,我仍然建議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.keys

Object.keys(h)

您可以使用Underscore.js ,這是一個 JavaScript 實用程序庫。

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

這是你能做的最好的,據我所知......

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

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

我相信您可以使用 for/in 循環遍歷對象的屬性,因此您可以執行以下操作:

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

我想用AnnanFay 的回答

Object.prototype.keys = function () ...

但是,當將它與Google Maps API v3 結合使用時,Google Maps 將不起作用。

然而,

for (var key in h) ...

效果很好。

在 Javascript 中,我們可以使用

Object.keys(h)

如果您只想獲取元素,而不是函數,那么此代碼可以幫助您:

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 對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM