8

次のような連想配列を作成しましょう。

var aArray = {};
aArray.id = 'test';
aArray['x1'] = [1,2,3];
aArray['stackoverflow'] = 'What\'s up?';
aArray['x2'] = [4,5,6];
var keys = [];
for(var key in aArray) {
  if (aArray.hasOwnProperty(key)) {
    keys.push(key);
  }
}
console.log(keys);

キーの配列をループなしで配列変数に取得する簡単/短い方法はありますか?

もしそうなら、さらに、いくつかの正規表現をキーリストに適用して、別のループなしでそのようなパターン(たとえば /^x/に一致するキーだけを取得することは可能ですか?

4

2 に答える 2

16

キーの配列をループなしで配列変数に取得する簡単/短い方法はありますか?

はい、ECMAScript5はこれを行うように定義Object.keysしています。(Object.getOwnPropertyNames列挙できないものも取得します。)ほとんどの最新のブラウザーエンジンにはおそらくそれがありますが、古いものにはありませんが、簡単にシムされます(たとえば、このシムにはあります)。

/^x/もしそうなら、さらに、いくつかの正規表現をキーリストに適用して、 (別の)ループなしでそのようなパターン(たとえば)に一致するキーだけを取得することは可能ですか?

いいえ、そのための組み込み機能はありませんが、次のように書くのはかなり簡単な関数です。

function getKeys(obj, filter) {
    var name,
        result = [];

    for (name in obj) {
        if ((!filter || filter.test(name)) && obj.hasOwnProperty(name)) {
            result[result.length] = name;
        }
    }
    return result;
}

または、上に構築しますObject.keys(そして、2020年後半にこの部分を書いているので、ES2015 +機能を使用します):

function getKeys(obj, filter) {
    const keys = Object.keys(obj);
    return !filter ? keys : keys.filter(key => filter.test(key) && obj.hasOwnProperty(key));
}
于 2012-07-19T13:00:45.290 に答える
14

2020年には、すべてのブラウザがこれをサポートしてIE9に戻ります。これが進むべき道です。

JavaScript 1.8.5には、この機能がObject.keys()に組み込まれています。すべてのキーの配列を返します。サポートされていないブラウザにはシムを使用できます(MDNでもサポートされています)。

例として、これを参照してください(jsFiddle)...

var obj = { "cat" : "meow", "dog" : "woof"};
alert(Object.keys(obj)); // "cat,dog"
于 2012-07-19T12:58:05.847 に答える