質問

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 の回答も読む必要があります。

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

使用できます Object.keys

Object.keys(h)

使用できます アンダースコア.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;
}

上記の最高評価の回答を使用したかったのですが

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

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

for (var key in 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 キーを含むハッシュマップ オブジェクトです

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top