web-dev-qa-db-ja.com

Javascriptでオブジェクトの最初のプロパティにアクセスするにはどうすればいいですか?

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

  1. あなたの財産の名前がわからないところ
  2. for .. inやjQueryの$.eachのようなループを使わずに

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

var example = {
    foo1: { /* stuff1 */},
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};
500
atogle
var obj = { first: 'someVal' };
obj[Object.keys(obj)[0]]; //returns 'someVal'

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

1196
Grzegorz Kaczan

for … inループ を試して、最初の反復の後で中断してください。

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

オブジェクトのプロパティの配列を取得するには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)

ドキュメントとクロスブラウザシムは here を提供しました。その使用例は、私の回答の他の1つにあります ここ

編集 :わかりやすくするために、他の回答で正しく述べられていることをそのまま反映したいと思います。JavaScriptオブジェクトのキーの順序は未定義です。

44
benekastah

Object.values(example)[0]もできます。

34
garrettmaring

"first"プロパティはありません。オブジェクトキーは順不同です。

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

21
Quentin

ワンルールバージョン

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

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

中括弧({})で囲まれた、ゼロ個以上のプロパティ名とオブジェクトに関連付けられた値のリスト。

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

9
Alex Rozanski

lodash libraryを使用した解決策:

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

ただし、javascript VM実装に依存するため、オブジェクトプロパティの内部記憶順序は保証されません。

9
pocheptsov

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

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

しかし、最初のものだけが必要な場合は、以下のようなより短い解決策を手配することができます。

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"}
3
Javier Cobos

これについては以前に説明しました。

Firstの概念はオブジェクトプロパティには適用されず、for ... inループの順序は仕様によって保証されていませんが、実際には確実にFIFO を除いて クロム用( バグ報告 )。それに応じて決定を下します。

2
annakata

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

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

これは常に最初のプロパティの値、この場合 'someVal'を返します。

1
Hamza Boularbah

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

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']
1
Diego Unanue

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

0
Flavius Stef

オブジェクト(角括弧)の代わりに配列を使用してください。

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

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

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

これをしない理由は何ですか?

> example.map(x => x.name);

(3) ["foo1", "foo2", "foo3"]
0
jtr13