オブジェクトの最初のインデックスを取得する


201

考慮してください:

var object = {
  foo: {},
  bar: {},
  baz: {}
}

どうすればいいですか:

var first = object[0];
console.log(first);

最初のインデックスの名前がではなくであるため、これは機能しませfoo0

console.log(object['foo']);

動作しますが、fooという名前かわかりません。名前はなんでもかまいません。私は最初が欲しいだけです。

回答:


61

オブジェクトの順序が重要な場合は、JSONスキーマを修正して、オブジェクトを配列に格納する必要があります。

[
    {"name":"foo", ...},
    {"name":"bar", ...},
    {"name":"baz", ...}
]

または多分:

[
    ["foo", {}],
    ["bar", {}],
    ["baz", {}]
]

Ben Alpertが指摘するように、Javascriptオブジェクトのプロパティは順序付けされておらず、オブジェクトリテラルで指定されているのと同じ順序で列挙すると予想される場合、コードは壊れます。「最初の」プロパティはありません。


6
for(i in obj)が別の順序で実行するのを見たことがありません。ときどきfor(i in obj)が別の順序で処理を実行するということですか?
ライアンフローレンス

4
それが可能である可能性があります。仕様では、特定の順序で列挙する必要はないとしています。これは、その順序が変わる可能性があることを意味します。
PatrikAkerstrand 2009年

5
最近のほとんどのブラウザーは挿入順序を保持していますが、常にそうであるとは限りませんでした。仕様では必須ではありません。また、挿入順序を保持しない最新バージョンのChromeがありました。
マイル

1
何をしているのかを深く掘り下げていくと、物事の順序がより重要になり(最初は気にするだけだと思っていましたが、間違っていました!)、あなたが提案したようにオブジェクトを配列に格納することは明らかでした。
ライアンフローレンス

1
オブジェクトに要素が1つしかないことがわかっている場合は、順序がわかります。
danorton 2010

329

ちょうど楽しみのためにこれはJS 1.8.5で動作します

var obj = {a: 1, b: 2, c: 3};
Object.keys(obj)[0]; // "a"

これは、あなたがしているのと同じ順序に一致します

for (o in obj) { ... }

24
石器時代のバックワード互換性が要求されない限り、明らかに最良のオプションです。
Dag Sondre Hansen

1
100%最高の答え。これは、これを行う最も簡単で最速の方法です。
ケース

3
明確にするために、en.wikipedia.org / wiki / JavaScript#Version_historyによれば、JS 1.8.5はIE9より前ではサポートされていません。残念ながら、多くの人々はまだ石器時代です。
Noremac 14

偉大な者。短くてシンプル。ありがとう@Jacob
Sariban D'Cl

誰かがIE9を使用している場合、私は彼の痛みを感じます。ありがとう、これはすばらしい
CMS

204

あなたが簡潔なものが欲しいなら、試してみてください:

for (first in obj) break;

alert(first);

関数としてラップ:

function first(obj) {
    for (var a in obj) return a;
}

8
以下のLuke Schaferの回答を参照してください。hasOwnPropertyメソッドを使用して、プロトタイプメンバーを取得しないようにします。
コードコマンダー

3
IE8以下を含むすべてのブラウザーで1つのライナーを機能さfor (var key in obj) if (obj.hasOwnProperty(key)) break;せるには、key変数を使用する必要があります
Ally

最初の要素がオブジェクト型の場合は機能しません。0を返します

Object.keys(obj)[0];(1.644ms)よりもはるかに高速ですfor(0.072ms)。
Sebastian Ortmann

77

実際には注文されていませが、次のことができます。

var first;
for (var i in obj) {
    if (obj.hasOwnProperty(i) && typeof(i) !== 'function') {
        first = obj[i];
        break;
    }
}

これ.hasOwnProperty()は、プロトタイプ化されたオブジェクトを無視することが重要です。


上記のコードにエラーがあります。typeofチェックはtypeof(i)である必要があります
jacob.toye

@Napalm彼は構文ではなく、チェックされている変数名のエラーを参照していました。あなたは正しいですが、多くの人は読みやすさのためにブラケットを好んでいます
Luke Schafer、

ありがとうございました。すごい。
Santosh

76

JavaScriptオブジェクトは順序付けされていないため、最初のオブジェクトは提供されませんが、場合によってはこれで問題ありません。

myObject[Object.keys(myObject)[0]]


18

JavaScriptの「ハッシュ」(オブジェクト)には順序付けられていないプロパティがあるため、最初の要素を取得する方法はありません。あなたの最善の策は、配列にキーを格納することです:

var keys = ["foo", "bar", "baz"];

次に、それを使用して適切な値を取得します。

object[keys[0]]


12

アンダースコアを使用すると、次のように_.pairsを使用して、最初のオブジェクトエントリをキーと値のペアとして取得できます。

_.pairs(obj)[0]

次に、キーは追加の[0]添え字で使用でき、値は[1]


underscore.jsを使用する場合に最適です。ちょうど私が必要なもの...ありがとう、ジョージ!
Goldengalaxy 2017年

10

昨日も同じ問題がありました。私はそれを次のように解決しました:

var obj = {
        foo:{},
        bar:{},
        baz:{}
    },
   first = null,
   key = null;
for (var key in obj) {
    first = obj[key];
    if(typeof(first) !== 'function') {
        break;
    }
}
// first is the first enumerated property, and key it's corresponding key.

最もエレガントな解決策ではなく、ブラウザーによって結果が異なる可能性があることは間違いありません(つまり、仕様では、プロパティを定義された順序で列挙するために列挙は必要とされていません)。ただし、オブジェクトには1つのプロパティしかなかったため、問題はありませんでした。最初のキーだけが必要でした。


1
こんにちは@PatrikAkerstrand早い段階で誤って反対投票をクリックしました。アンサーを元に戻すには、変更を加えてください。ごめんなさい。
rogeriolino

7

あなたはこのようなことをすることができます:

var object = {
    foo:{a:'first'},
    bar:{},
    baz:{}
}


function getAttributeByIndex(obj, index){
  var i = 0;
  for (var attr in obj){
    if (index === i){
      return obj[attr];
    }
    i++;
  }
  return null;
}


var first = getAttributeByIndex(object, 0); // returns the value of the
                                            // first (0 index) attribute
                                            // of the object ( {a:'first'} )

6

オブジェクトの最初のキーを取得するには

const myObject = {
   'foo1': { name: 'myNam1' },
   'foo2': { name: 'myNam2' }
}

const result = Object.keys(myObject)[0];

// result will return 'foo1'

この答えとジェイコブの答えの違いは何ですか?
YakovL 2017年

それは、この種のコードが完全に機能することをより新鮮な人に自信を与えます。
Santosh

5

CMSの 回答に基づく。私は直接値を取得しませんが、代わりにそのインデックスでキーを取得し、これを使用して値を取得します。

Object.keyAt = function(obj, index) {
    var i = 0;
    for (var key in obj) {
        if ((index || 0) === i++) return key;
    }
};


var obj = {
    foo: '1st',
    bar: '2nd',
    baz: '3rd'
};

var key = Object.keyAt(obj, 1);
var val = obj[key];

console.log(key); // => 'bar'
console.log(val); // => '2nd'

2

私の解決策:

Object.prototype.__index = function(index)
{
    var i = -1;
    for (var key in this)
    {
        if (this.hasOwnProperty(key) && typeof(this[key])!=='function')
            ++i;
        if (i >= index)
            return this[key];
    }
    return null;
}
aObj = {'jack':3, 'peter':4, '5':'col', 'kk':function(){alert('hell');}, 'till':'ding'};
alert(aObj.__index(4));

12
素敵なものだけ…あなたのコーディングスタイル!なんてこったい?これらのブレースは至る所にあります!
空飛ぶ羊

2
Pythonスタイルを知っていますか?私は垂直に配置されたブレースをpythonスタイルに追加しました。とにかく、「地獄は他の人です」、:
D
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.