197

JavaScriptでは、オブジェクトはハッシュを兼ねていますが、キーを取得するための組み込み関数を見つけることができませんでした。

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

こんなもの欲しい

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

アイテムを反復処理し、返す配列にキーを追加する関数を自分で作成するのは簡単ですが、それを行うための標準的なよりクリーンな方法はありますか?

見逃してしまったシンプルな組み込み関数に違いないと感じ続けていますが、見つかりません!

4

9 に答える 9

282

Object.keysこの操作を実行すると呼ばれる最新の JavaScript (ECMAScript 5) の関数があります。

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;
}
于 2011-08-03T03:02:45.150 に答える
80

クライアント ブラウザとの大きな互換性を必要とするプロダクション コードについては、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 の回答も読む必要があります。

プロトタイプ関数を列挙不可にする方法はありません。これにより、 を使用しない for-in ループで常に現れることになりますhasOwnProperty。Object のプロトタイプの拡張がそれほど面倒でなければ、この答えは理想的だと思います。

于 2008-08-20T21:55:40.643 に答える
43

使用できますObject.keys

Object.keys(h)
于 2013-08-09T18:45:32.110 に答える
33

JavaScript ユーティリティ ライブラリであるUnderscore.jsを使用できます。

_.keys({one : 1, two : 2, three : 3});
// => ["one", "two", "three"]
于 2011-08-11T14:15:19.743 に答える
13

私が知る限り、これはあなたができる最善のことです...

var keys = [];
for (var k in h)keys.push(k);
于 2008-08-20T21:49:23.203 に答える
8

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 に感謝します。

于 2012-02-15T12:27:12.087 に答える
6

for/in を使用してオブジェクトのプロパティをループできると思うので、次のようなことができます。

function getKeys(h) {
  Array keys = new Array();
  for (var key in h)
    keys.push(key);
  return keys;
}
于 2008-08-20T21:51:08.613 に答える
4

私はAnnanFayの答えを使いたかった:

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

ただし、 Google Maps API v3と組み合わせて使用​​する場合、Google マップは機能しません。

でも、

for (var key in h) ...

うまく機能します。

于 2010-07-24T15:02:00.197 に答える
1

関数ではなく要素のみを取得しようとしている場合は、次のコードが役立ちます。

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 オブジェクトです。

于 2012-03-01T09:39:09.360 に答える