Mendapatkan indeks pertama dari suatu objek


201

Mempertimbangkan:

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

Bagaimana saya melakukan ini:

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

Jelas, itu tidak berhasil karena indeks pertama dinamai foo, bukan 0.

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

berfungsi, tapi saya tidak tahu itu bernama foo. Itu bisa disebut apa saja. Saya hanya ingin yang pertama.

Jawaban:


61

Jika urutan objek signifikan, Anda harus merevisi skema JSON Anda untuk menyimpan objek dalam array:

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

atau mungkin:

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

Seperti yang ditunjukkan Ben Alpert, properti dari objek Javascript tidak berurutan, dan kode Anda rusak jika Anda mengharapkannya untuk menyebutkan dalam urutan yang sama seperti yang ditentukan dalam objek literal — tidak ada properti "pertama".


6
Saya belum pernah melihat (i di obj) melakukan hal-hal dalam urutan yang berbeda, apakah Anda mengatakan bahwa kadang-kadang untuk (i in obj) akan mengeluarkan sesuatu dalam urutan yang berbeda?
Ryan Florence

4
Mungkin saja itu terjadi. Spesifikasi mengatakan bahwa itu tidak harus disebutkan dalam urutan tertentu. Ini cukup banyak berarti bahwa pesanan itu dapat berubah.
PatrikAkerstrand

5
Sebagian besar browser saat ini memang mempertahankan urutan penyisipan, tapi itu tidak selalu terjadi; itu tidak diperlukan oleh spesifikasi, dan ada versi terbaru Chrome yang tidak mempertahankan urutan penyisipan.
Miles

1
Ketika saya masuk lebih dalam ke dalam apa yang saya lakukan, urutan hal menjadi lebih penting (saya pikir saya hanya peduli tentang yang pertama, tetapi saya salah!), Jadi itu jelas untuk menyimpan objek saya dalam array seperti yang Anda sarankan.
Ryan Florence

1
Jika Anda tahu bahwa objek hanya memiliki satu elemen, maka Anda tahu urutannya.
danorton

329

Hanya untuk bersenang-senang ini berfungsi di JS 1.8.5

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

Ini cocok dengan urutan yang sama yang akan Anda lakukan

for (o in obj) { ... }

24
Kosongkan opsi terbaik kecuali jika diperlukan kompatibilitas kata kunci zaman batu.
Dag Sondre Hansen

1
100% jawaban terbaik. Ini adalah cara termudah dan tercepat untuk melakukan ini.
Perkara

3
Hanya untuk memperjelas, menurut en.wikipedia.org/wiki/JavaScript#Version_history JS 1.8.5 tidak didukung sebelum IE9. Sayangnya banyak orang masih di zaman batu.
Noremac

Bagus Singkat dan sederhana. Terima kasih @ Jacob
Sariban D'Cl

jika seseorang menggunakan IE9 😏 saya merasakan sakitnya. terima kasih ini luar biasa
CMS

204

Jika Anda menginginkan sesuatu yang ringkas cobalah:

for (first in obj) break;

alert(first);

dibungkus sebagai fungsi:

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

8
Lihat jawaban Luke Schafer di bawah ini, ia menggunakan metode hasOwnProperty untuk memastikan Anda tidak mengambil anggota prototipe.
Code Commander

3
Agar satu liner bekerja di semua browser termasuk IE8 dan penggunaan di bawah for (var key in obj) if (obj.hasOwnProperty(key)) break;Anda akan ingin menggunakan keyvariabel
Ally

tidak berfungsi jika elemen pertama adalah tipe objek. mengembalikan 0
salju

Object.keys(obj)[0];jauh lebih cepat (0,072 ms) daripada for(1,644 ms).
Sebastian Ortmann

77

mereka tidak benar - benar dipesan, tetapi Anda dapat melakukannya:

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

yang .hasOwnProperty()penting untuk mengabaikan objek prototipe.


Ada kesalahan dalam kode di atas. Pemeriksaan typeof harus typeof (i)
jacob.toye

@Napalm dia merujuk pada kesalahan dalam nama variabel yang diperiksa, bukan sintaks. Anda benar, tetapi banyak orang menyukai tanda kurung agar mudah dibaca
Luke Schafer

Terima kasih. Luar biasa.
Santosh

76

Ini tidak akan memberi Anda yang pertama karena objek javascript tidak diurutkan, namun dalam beberapa kasus ini baik-baik saja.

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

39

untuk kunci objek pertama yang dapat Anda gunakan

console.log(Object.keys(object)[0]);//print key's name

untuk nilai

console.log(object[Object.keys(object)[0]]);//print key's value

18

Tidak ada cara untuk mendapatkan elemen pertama, mengingat "hashes" (objek) dalam JavaScript memiliki sifat yang tidak terurvei. Taruhan terbaik Anda adalah menyimpan kunci dalam array:

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

Kemudian gunakan itu untuk mendapatkan nilai yang tepat:

object[keys[0]]

16

ES6

const [first] = Object.keys(obj)

Ini bekerja, tetapi bisakah Anda menjelaskan bagaimana ini bekerja? Hanya menunjukkan kode gagal membuat saya memahaminya.
Daan

1
Ini tugas yang merusak . Pada dasarnya, ini memberikan elemen pertama dari array yang dikembalikan ke variabel dalam tanda kurung.
Richard Ayotte

12

Menggunakan garis bawah Anda dapat menggunakan _.pairs untuk mendapatkan entri objek pertama sebagai pasangan nilai kunci sebagai berikut:

_.pairs(obj)[0]

Maka kunci akan tersedia dengan [0]subskrip lebih lanjut , nilainya dengan[1]


Berfungsi paling baik saat underscore.js digunakan. Apa yang saya butuhkan ... Terima kasih, George!
Goldengalaxy

10

Saya memiliki masalah yang sama kemarin. Saya menyelesaikannya seperti ini:

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.

Bukan solusi yang paling elegan, dan saya cukup yakin bahwa itu dapat menghasilkan hasil yang berbeda di browser yang berbeda (yaitu spesifikasi mengatakan bahwa enumerasi tidak diperlukan untuk menghitung properti dalam urutan yang sama seperti yang telah ditentukan). Namun, saya hanya memiliki satu properti di objek saya sehingga tidak menjadi masalah. Saya hanya perlu kunci pertama.


1
Hai @ PatrikAkerstrand awal Saya tidak sengaja mengklik downvote. Harap lakukan perubahan apa pun di server Anda untuk membatalkannya. Maaf.
rogeriolino

7

Anda dapat melakukan sesuatu seperti ini:

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

Untuk mendapatkan kunci pertama dari objek Anda

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

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

// result will return 'foo1'

Apa perbedaan jawaban ini dengan jawaban Yakub?
YakovL

itu memberi keyakinan kepada segar bahwa kode semacam ini bekerja dengan sempurna.
Santosh

5

Berdasarkan jawaban CMS . Saya tidak mendapatkan nilainya secara langsung, alih-alih saya mengambil kunci pada indeksnya dan menggunakan ini untuk mendapatkan nilainya:

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

Solusi saya:

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
bagus, hanya ... gaya pengkodean Anda! apa apaan? kawat gigi itu ada di mana-mana!
domba terbang

2
Apakah Anda tahu gaya python? Saya baru saja menambahkan kurung vertikal-aligned ke gaya python. Pokoknya, "Neraka adalah orang lain", :-D
diyism
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.