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.

Ryan Florence
sumber

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".

Miles
sumber
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) { ... }
Yakub
sumber
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;
}
Patrick Hayes
sumber
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.

Luke Schafer
sumber
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]]
Rob Fox
sumber
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
jitendra varshney
sumber
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]]
Sophie Alpert
sumber
16

ES6

const [first] = Object.keys(obj)
Richard Ayotte
sumber
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]

Dexygen
sumber
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.

PatrikAkerstrand
sumber
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'} )
CMS
sumber
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'
LDL
sumber
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'
yaart
sumber
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));
diyism
sumber
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