JavaScriptオブジェクトキーリストの取得


295

私はのようなJavaScriptオブジェクトを持っています

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}

このオブジェクトのキーの長さとリストを取得するにはどうすればよいですか?



@TJ全く同じではないと思います。これはオブジェクトであり、複製はJSONオブジェクトです。
GuyT 2014年

アンダースコアがある場合は、単に_.keys(your_object)
minhajul

1
2010年以降状況が変化しているため、最も投票された回答を「回答」として受け入れる方がよいかもしれません
Jonas Wilms

回答:


341

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
};
var keys = [];

for (var k in obj) keys.push(k);

alert("total " + keys.length + " keys: " + keys);


JavaScriptがPHPに似ているとは思いません。最初の行をすべてスキップできますか?とにかくそのようなことはお勧めできません。
Bart van Heukelom、2010年

@バート:いいえ、JavaScriptでは最初の行が必要です。
ダニエルヴァッサロ

6
ここでのエッジケースについては、以下のDavid Morrisseyのコメントをご覧ください。このアプローチを取ると、プロトタイプの不要なメンバーがに表示されることがありkeysます。

2
@pat:オブジェクトリテラルを使用している場合は、を拡張する場合にのみ発生しますObject.prototype。ただし、カスタムコンストラクターについては、そのとおりです。
Sasha Chedygov

@BartvanHeukelomは2010年6月にも通知を引き起こしました。これは、暗黙的にオブジェクトを入力していることを意味します。[]これに(またはarray()その当時に)割り当てると、配列になり、配列として安全に使用できます。
Niels Keurentjes 2014年

627

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}
var keys = Object.keys(obj);
console.log('obj contains ' + keys.length + ' keys: '+  keys);

現在、ほとんどの主要ブラウザでサポートされています。


7
Chromeで機能するという事実は、Node.jsでも機能することを意味します。どちらもV8 JavaScriptエンジンで構築されているためです。
Homme Zwaagstra 2013年

9
@fet最近、はい。2年前、それほどではありません。
AlbertEngelB 2013年

4
これはfor(key in ob)Object.keysプロトタイプからのキーをリスト.. in objしませんが、リストします。
アルバート

9
@fet windows7はIE8に付属しています。人々がIE8の使用をやめるまで、これが受け入れられる答えになる方法はありません。
snuggles

1
ここでdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/…古いブラウザで正しく動作し、新しいブラウザの機能を上書きしないJavaScriptメソッドを見つけます。以下の私の答えも参照してください。
Sandro

27

Underscore.jsは変換をかなりクリーンにします。

var keys = _.map(x, function(v, k) { return k; });

編集:これもできることを逃しました:

var keys = _.keys(x);

正解です。実際のアンダースコアソース:nativeKeys = Object.keys; hasOwnProperty = ObjProto.hasOwnProperty; .has = function(obj、key){return hasOwnProperty.call(obj、key); }; _.keys = nativeKeys || function(obj){if(obj!== Object(obj))throw new TypeError( 'Invalid object'); var keys = []; for(var key in obj)if( .has(obj、key))keys.push(key); リターンキー; };
ミゲルアレハンドロフエンテスロペス

18

特定のオブジェクトに固有であり、派生prototypeプロパティではないキーのみが必要な場合:

function getKeys(obj) {
    var r = []
    for (var k in obj) {
        if (!obj.hasOwnProperty(k)) 
            continue
        r.push(k)
    }
    return r
}

例えば:

var keys = getKeys({'eggs': null, 'spam': true})
var length = keys.length // access the `length` property as usual for arrays

4
var keys = new Array();
for(var key in obj)
{
   keys[keys.length] = key;
}

var keyLength = keys.length;

オブジェクトから任意の値にアクセスするには、obj [key]を使用できます。


配列インデックスをインクリメントする必要があります
Vivek

配列のインデックスはによって自動的にインクリメントされますkeys.length。これは、反復ごとに値が挿入されるため、反復ごとに異なります。
KrekkieD 2014

4
obj = {'a':'c','b':'d'}

あなたが試すことができます:

[index for (index in obj)] 

これは返されます:

['a','b']

キーのリストを取得する、または

[obj[index] for (index in obj)]

値を取得する


Google Chrome v16.0.912.75では機能しませんが、Firefox v10.0では機能します
RobM

4

Anuragsの答えは基本的に正しいです。ただしObject.keys(obj)、古いブラウザでもサポートするには、https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keysからコピーされた以下のコードを使用でき ますObject.keys(obj)ブラウザから利用できない場合は、メソッドを追加します。

if (!Object.keys) {
 Object.keys = (function() {
 'use strict';
 var hasOwnProperty = Object.prototype.hasOwnProperty,
    hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),
    dontEnums = [
      'toString',
      'toLocaleString',
      'valueOf',
      'hasOwnProperty',
      'isPrototypeOf',
      'propertyIsEnumerable',
      'constructor'
    ],
    dontEnumsLength = dontEnums.length;

return function(obj) {
  if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {
    throw new TypeError('Object.keys called on non-object');
  }

  var result = [], prop, i;

  for (prop in obj) {
    if (hasOwnProperty.call(obj, prop)) {
      result.push(prop);
    }
  }

  if (hasDontEnumBug) {
    for (i = 0; i < dontEnumsLength; i++) {
      if (hasOwnProperty.call(obj, dontEnums[i])) {
        result.push(dontEnums[i]);
      }
    }
  }
  return result;
};
}());
}

3

coffeescriptでは、これはすべてのブラウザとノードで次のように実行できることに注意してください

k for k of obj

したがって

(1 for _ of obj).length

3

ECMAScript 5をサポートするブラウザーの再帰的ソリューション:

var getObjectKeys = function(obj) {
    var keys = Object.keys(obj);
    var length = keys.length;

    if (length !== 0) {
        for (var i = 0; i < length; i++) {
            if (typeof obj[keys[i]] === 'object') {
                keys[keys[i]] = getObjectKeys(obj[keys[i]]);
            }
        }
    }

    return keys;
};

3
var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}

console.log(Object.keys(obj));
console.log(Object.keys(obj).length)


3

Underscore.jsを使用する場合は、

var obj = {
    key1: 'value1',
    key2: 'value2',
    key3: 'value3',
    key4: 'value4'
}

var keys = [];
_.each( obj, function( val, key ) {
    keys.push(key);
});
console.log(keys.lenth, keys);

3

JavaScriptでは、オブジェクトは、プロパティとタイプを持つスタンドアロンエンティティです。

配列の形式でオブジェクトから値をフェッチする場合: Object .values(obj)// objは、使用したオブジェクト名です Result -> ["value1"、 "value2"、 "value3"、 "value4"]

配列の形式でオブジェクトからキーをフェッチする場合: Object .keys(obj)// objは、使用したオブジェクト名です Result -> ["key1"、 "key2"、 "key3"、 "key4"]

両方の関数が配列を返すため、lengthプロパティを使用してキーまたは値の長さを取得できます。例えば- オブジェクト .values(OBJ).LENGTH または オブジェクト .keys(OBJ).LENGTH


2

JSONオブジェクトのキーをリストするコンマ区切りの文字列については、以下を試してください。

function listKeys(jObj){
    var keyString = '';
    for(var k in jObj){
        keyString+=(','+k);
    }
    return keyString.slice(1);
}



/* listKeys({'a' : 'foo', 'b' : 'foo', 'c' : 'foo'}) -> 'a,b,c' */

2

ES6を使用するforEachと、を使用してオブジェクトのキーを反復できます。Object.keysオブジェクト内のすべてのキーを返す、使用できるすべてのキーを取得するには

Object.keys(obj).forEach(function(keyValue, index, map) { 
  console.log(keyValue); 
});

上記のスニペットの短い手は、1つのパラメーターのみを受け取ります。

Object.keys(obj).forEach(function(keyValue) { 
  console.log(keyValue); 
});


0

スライス、適用、結合方法を使用します。

var print = Array.prototype.slice.apply( obj );
alert('length='+print.length+' list'+print.join());
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.