JavaScriptオブジェクトの最初のプロパティにアクセスする方法は?


611

オブジェクトの最初のプロパティにアクセスするためのエレガントな方法はありますか...

  1. プロパティの名前がわからない場合
  2. for .. inまたはjQueryのようなループを使用せずに$.each

たとえばfoo1、foo1の名前を知らなくてもオブジェクトにアクセスする必要があります。

var example = {
    foo1: { /* stuff1 */},
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};

1
最初に配列に変換する方が良いでしょう
cregox 2017年

回答:


1393
var obj = { first: 'someVal' };
obj[Object.keys(obj)[0]]; //returns 'someVal'

これを使用すると、インデックスによって他のプロパティにもアクセスできます。気をつけて!Object.keysECMAScriptによると、返品順序は保証されていませんが、非公式にはすべての主要なブラウザー実装によるものです。詳細については、https://stackoverflow.com/a/23202095を参照してください。


25
あなたはそれが最速の方法ではないと言います。どっちが速いの?
T Nguyen

3
これは、オブジェクトのすべてのキーの配列全体を作成するため、あまり効率的ではありません。
Andrew Mao

9
@T Nguyen知っていれば投稿します:)
Grzegorz Kaczan 14

5
@DavChana-ベンチマークの設定が間違っていました。定型ブロックが常に実行され、あなたのブロック2は、最初の結果は、実行表し意味、空だった+ブロック1定型文を、第二の結果のみを表す定型を正しいベンチマークは次のとおりです:http : //jsben.ch/#/R9aLQは、それらがほとんど同じであることを示しています(テストを複数回実行します)。
myfunkyside 2016年

9
私が望むのfirst()か、似たようなものがこれを処理できるでしょう。
Fr0zenFyr

113

for … inループを試して、最初の反復の後で中断します。

for (var prop in object) {
    // object[prop]
    break;
}

1
これが唯一の選択肢だと思います。プロパティが予測可能な/便利な順序で反復されることが保証されているかどうかはわかりません。つまり、foo1を意図しても、foo3を取得できます。例のようにプロパティに番号が付けられている場合は、文字列を比較して、「1」で終わる識別子を確認できます。繰り返しますが、順序性がコレクションの主な関心事である場合は、オブジェクトではなく配列を使用する必要があります。
蒸し器25 2009年

2
誰がために心配されている場合は、ほとんどのブラウザでは、予想通りに動作します。stackoverflow.com/questions/280713/...を
フラッシュ

6
var prop; for(object in prop)break; // object [prop]
netiul 2014年

12
古い答えですが。プロパティがオブジェクトに属しているかどうかを確認したい場合があります。like:for(..){if(!obj.hasOwnProperty(prop))continue; ....休憩; }オブジェクトが実際に空の場合に備えて、プロトタイプなどを通過しません。
pgarciacamou 2014


46

Object.keysオブジェクトのプロパティの配列を取得するために使用します。例:

var example = {
    foo1: { /* stuff1 */},
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};

var keys = Object.keys(example); // => ["foo1", "foo2", "foo3"] (Note: the order here is not reliable)

ドキュメントとクロスブラウザシムはここにあります。その使用例は、こちらの私の回答の別の1つにあります

編集:わかりやすくするために、他の回答で正しく述べられたことをエコーし​​たいだけです。JavaScriptオブジェクトのキーの順序は定義されていません。


25

1ルールバージョン:

var val = example[function() { for (var k in example) return k }()];

2
オブジェクトにはプログラムで追加された不要な値が含まれているため、このスニペットから不要な結果が得られる可能性があるため、for inチェックせずに使用すると危険なhasOwnProperty場合があります。短くてすっきりしているからといって、安全で最適なわけではありません。
Javier Cobos

24

「最初の」プロパティはありません。オブジェクトキーは順不同です。

それらをループする場合(var foo in bar)、それらはある順序で取得されますが、将来的には変更される可能性があります(特に他のキーを追加または削除した場合)。


驚くばかり。オブジェクトを使用して、挿入順序を維持するマップを実装しています。次の挿入がギャップを埋めるので、値を削除すると壊れます。:(
デビッド・ハークネス

2
JSの新しいバージョンでキー/値の順序を保持する必要があります
Alexander Mills

11

lodashライブラリを使用したソリューション:

_.find(example) // => {name: "foo1"}

ただし、JavaScript VMの実装に依存しているため、オブジェクトプロパティの内部ストレージ順序は保証されません。


2
これをテストしただけで動作しません。キーと値のペアではなく、値のみを返します。
Chris Haines 2017

2
キーと値のペアを返す必要があるという質問には言及されていません。彼はオブジェクトを要求するだけで、受け入れられた回答はこのlodash関数と同じくらい多くのことを行います。最初のプロパティのコンテンツを返します。それはあなたの特定のニーズに合わないかもしれませんが、この答えは元の質問に基づいて正しいです。
Carrm 2018年

はい、ジョブは実行します。オブジェクトに子オブジェクトが1つしかないことがわかっている場合に便利ですvar object = { childIndex: { .. } }; var childObject = _.find(Object);
Raja Khoury

9

いいえ。MDCで定義されているオブジェクトリテラルは次のとおりです。

中括弧({})で囲まれた、オブジェクトのプロパティ名と関連する値の0個以上のペアのリスト。

したがって、オブジェクトリテラルは配列ではなく、明示的な名前またはキーワードforを使用したループを使用してのみプロパティにアクセスできますin


25
この回答の緑色のチェックマークのみが表示されている他のユーザーには、現在350の賛成票があるページのさらに下に別の解決策があります。
redfox05 2015年

7

一番上の答えは、配列全体を生成し、リストからキャプチャすることです。これは別の効果的なショートカットです

var obj = { first: 'someVal' };
Object.entries(obj)[0][1] // someVal

3

これは以前にここでカバーされました。

最初の概念はオブジェクトのプロパティには適用されず、for ... inループの順序は仕様によって保証されていませんが、実際には、クロム(バグレポートを除いて、信頼性の高いFIFO です。それに応じて決定します。


3

古いIEバージョンではサポートされていないため、Object.keysの使用はお勧めしません。しかし、本当にそれが必要な場合は、上記のコードを使用して、後方互換性を保証できます。

if (!Object.keys) {
Object.keys = (function () {
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 = [];

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

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

機能Firefox(Gecko)4(2.0)Chrome 5 Internet Explorer 9 Opera 12 Safari 5

より詳しい情報: https //developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys

ただし、最初の1つだけが必要な場合は、次のような短い解決策を用意できます。

var data = {"key1":"123","key2":"456"};
var first = {};
for(key in data){
    if(data.hasOwnProperty(key)){
        first.key = key;
        first.content =  data[key];
        break;
    }
}
console.log(first); // {key:"key",content:"123"}

2

オブジェクトの最初のキー名を取得するには、以下を使用できます。

var obj = { first: 'someVal' };
Object.keys(obj)[0]; //returns 'first'

文字列を返すため、次のようなネストされたオブジェクトにアクセスできません。

var obj = { first: { someVal : { id : 1} }; ここでは、そのソリューションではIDにアクセスできません。

実際のオブジェクトを取得したい場合の最善の解決策は、次のようなlodashを使用することです。

obj[_.first(_.keys(obj))].id

最初のキーの値を返すには(最初のキーの名前が正確にわからない場合):

var obj = { first: 'someVal' };
obj[Object.keys(obj)[0]]; //returns 'someVal'

キー名がわかっている場合は、次のように使用します。

obj.first

または

obj['first']

0

「オブジェクトの最初のプロパティ」にアクセスする必要がある場合は、ロジックに問題がある可能性があります。オブジェクトのプロパティの順序は重要ではありません。


あなたが正しい。それ自体は必要ありませんが、fooプロパティの1つだけを使用して作業できます。ただのため...で使用しなくても、「最初の」1をつかむための方法があった場合、私は一つだけを必要として確認されませんでした。
atogle

0

オブジェクト(角括弧)の代わりに配列を使用します。

var example = [ {/* stuff1 */}, { /* stuff2 */}, { /* stuff3 */}];
var fist = example[0];

'foo'識別子を失うことに注意してください。ただし、含まれているオブジェクトに名前プロパティを追加できます。

var example = [ 
  {name: 'foo1', /* stuff1 */},
  {name: 'foo2', /* stuff2 */},
  {name: 'foo3', /* stuff3 */}
];
var whatWasFirst = example[0].name;

私たちができない状況があります。これらが配列に含まれていないという事実を変更できないと仮定します
1mike12

1
JSONスキーマを制御できる読者にとっては、デザインを少し後押しすることは有用だと思います。基本的に、私はいくつかの例を挙げてFlavius Stefの回答を拡張しています。
Steamer25


0

Object.prototype.keyswhich を使用すると、オブジェクトのすべてのキーを同じ順序で返します。したがって、最初のオブジェクトが必要な場合は、その配列を取得し、最初の要素を目的のキーとして使用します。

const o = { "key1": "value1", "key2": "value2"};
const idx = 0; // add the index for which you want value
var key = Object.keys(o)[idx];
value = o[key]
console.log(key,value); // key2 value2

1
古い質問に回答するとき、回答がどのように役立つかを説明するコンテキストを含めた場合、特に既に回答が受け入れられている質問の場合、他のStackOverflowユーザーにとってあなたの回答ははるかに役立ちます。参照:良い回答を書くにはどうすればよいですか
デビッドバック

0

このアプローチでも可能です。

var example = {
  foo1: { /* stuff1 */},
  foo2: { /* stuff2 */},
  foo3: { /* stuff3 */}
}; 
Object.entries(example)[0][1];

0

最初のキーを取得するよりクリーンな方法を次に示します。

var example = {
    foo1: { /* stuff1 */},
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};

var object2 = {
    needThis: 'This is a value of the property',
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};

let [first] = Object.keys(example)
let [firstProp] = Object.keys(object2)

console.log(first)
//Prop : needThis, Value: This is a value of the property
console.log(`Prop : ${firstProp}, Value: ${object2[firstProp]}`)


しかし、なぜ周りの配列[first]。ユーザーは答えとして配列を要求しませんでした。なぜこれを行うのですか?first = Object.keys(example)[0]答えを配列でラップする必要なしに同じことをします。なぜあなたはもっときれいなの?
Michael Durrant

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.