Bagaimana cara mengakses properti pertama dari objek Javascript?

611

Apakah ada cara yang elegan untuk mengakses properti pertama dari suatu objek ...

  1. di mana Anda tidak tahu nama properti Anda
  2. tanpa menggunakan loop like for .. inatau jQuery$.each

Misalnya, saya perlu mengakses foo1objek tanpa mengetahui nama foo1:

var example = {
    foo1: { /* stuff1 */},
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};
atogle
sumber
1
mungkin lebih baik untuk mengubahnya menjadi Array terlebih dahulu
cregox

Jawaban:

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

Dengan ini, Anda juga dapat mengakses properti lain berdasarkan indeks. Sadarilah! Object.keyspesanan kembali tidak dijamin sesuai ECMAScript namun secara tidak resmi itu oleh semua implementasi browser utama, silakan baca https://stackoverflow.com/a/23202095 untuk rincian tentang ini.

Grzegorz Kaczan
sumber
25
Anda mengatakan bahwa itu bukan cara tercepat. Cara apa yang lebih cepat?
T Nguyen
3
Ini tidak terlalu efisien karena ia menciptakan seluruh array dari semua kunci objek.
Andrew Mao
9
@ T Nguyen saya akan mempostingnya jika saya tahu itu :)
Grzegorz Kaczan
5
@DavChana - Anda salah mengatur benchmark. The blok boilerplate akan selalu dijalankan dan Anda blok 2 itu kosong, yang berarti hasil pertama merupakan eksekusi boilerplate + block1 , dan hasil kedua hanya mewakili boilerplate . Berikut ini adalah tolok ukur yang benar: http://jsben.ch/#/R9aLQ , menunjukkan bahwa mereka hampir sama (jalankan tes beberapa kali).
myfunkyside
9
Saya berharap first()atau sesuatu yang serupa bisa menangani ini.
Fr0zenFyr
113

Coba for … inloop dan istirahat setelah iterasi pertama:

for (var prop in object) {
    // object[prop]
    break;
}
Gumbo
sumber
1
Saya pikir ini adalah satu-satunya pilihan. Saya tidak yakin Anda dijamin bahwa properti akan diulang dalam urutan yang dapat diprediksi / berguna. Yaitu, Anda mungkin berniat foo1 tetapi mendapatkan foo3. Jika properti diberi nomor seperti pada contoh, Anda bisa melakukan string dibandingkan untuk memastikan pengidentifikasi berakhir dengan '1'. Kemudian lagi, jika ordinalitas adalah perhatian utama koleksi, Anda mungkin harus menggunakan array, bukan objek.
steamer25
2
Jika ada orang lain yang khawatir dengan pesanan tersebut, sebagian besar peramban berperilaku dapat diprediksi: stackoverflow.com/questions/280713/…
Flash
6
var prop; untuk (menyangga objek) istirahat; // objek [prop]
netiul
12
Jawaban lama tapi. Anda mungkin ingin memeriksa apakah properti itu milik objek. like: for (..) {if (! obj.hasOwnProperty (prop)) melanjutkan; .... istirahat; } kalau-kalau objek tersebut benar-benar kosong itu tidak melintasi prototipe atau sesuatu.
pgarciacamou
46

Gunakan Object.keysuntuk mendapatkan array properti pada objek. Contoh:

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

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

Dokumentasi dan shim lintas-browser disediakan di sini . Contoh penggunaannya dapat ditemukan di salah satu jawaban saya di sini .

Sunting : untuk kejelasan, saya hanya ingin menggemakan apa yang dinyatakan dengan benar dalam jawaban lain: urutan kunci dalam objek javascript tidak ditentukan.

benekastah
sumber
25

Versi satu aturan:

var val = example[function() { for (var k in example) return k }()];
netiul
sumber
2
Kadang-kadang bisa berisiko untuk digunakan for intanpa memeriksa hasOwnPropertykarena objek berisi nilai-nilai lain yang tidak diinginkan ditambahkan ke program sehingga Anda akhirnya bisa mendapatkan hasil yang tidak diinginkan dari potongan ini. Hanya karena pendek dan rapi bukan berarti aman optimal.
Javier Cobos
24

Tidak ada properti "pertama". Kunci objek tidak berurutan.

Jika Anda mengulanginya dengan untuk (var foo in bar)Anda akan mendapatkannya dalam beberapa urutan, tetapi mungkin berubah di masa depan (terutama jika Anda menambah atau menghapus kunci lain).

Quentin
sumber
Luar biasa. Saya telah menggunakan objek untuk mengimplementasikan peta yang mempertahankan urutan penyisipan. Itu rusak begitu saya menghapus nilai karena penyisipan berikutnya mengisi celah. :(
David Harkness
2
order kunci / nilai harus dipertahankan dalam versi JS
Alexander Mills yang lebih baru
11

Solusi dengan perpustakaan lodash :

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

tetapi tidak ada jaminan dari urutan objek penyimpanan internal karena tergantung pada implementasi VM javascript.

pocheptsov
sumber
2
Baru saja menguji ini, dan itu tidak berhasil. Ini mengembalikan nilai saja, bukan pasangan kunci / nilai.
Chris Haines
2
Tidak ada disebutkan dalam pertanyaan bahwa ia harus mengembalikan pasangan kunci / nilai, ia hanya meminta objek dan jawaban yang diterima tidak sebanyak fungsi pondok ini: ia mengembalikan konten properti pertama. Mungkin tidak sesuai dengan kebutuhan spesifik Anda, tetapi jawaban ini BENAR berdasarkan pertanyaan awal.
Carrm
Ya berhasil, berguna ketika Anda tahu objek Anda hanya memiliki satu objek anakvar object = { childIndex: { .. } }; var childObject = _.find(Object);
Raja Khoury
9

Tidak. Objek literal, seperti yang didefinisikan oleh MDC adalah:

daftar nol atau lebih pasangan nama properti dan nilai terkait suatu objek, terlampir dalam kurung kurawal ({}).

Oleh karena itu objek literal bukan array, dan Anda hanya dapat mengakses properti menggunakan nama eksplisit atau forloop menggunakan inkata kunci.

Alex Rozanski
sumber
25
Bagi yang lain hanya melihat tanda centang hijau pada jawaban ini, ada solusi lain di bagian bawah halaman dengan 350 upvotes saat ini.
redfox05
7

Jawaban teratas dapat menghasilkan seluruh array dan kemudian menangkap dari daftar. Berikut ini jalan pintas lain yang efektif

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

Ini sudah dibahas di sini sebelumnya.

Konsep pertama tidak berlaku untuk properti objek, dan urutan for ... in loop tidak dijamin oleh spesifikasi, namun dalam praktiknya itu adalah FIFO andal kecuali kritis untuk chrome ( laporan bug ). Buat keputusan sesuai dengan itu.

annakata
sumber
3

Saya tidak menyarankan Anda untuk menggunakan Object.keys karena tidak didukung dalam versi IE lama. Tetapi jika Anda benar-benar membutuhkannya, Anda dapat menggunakan kode di atas untuk menjamin kompatibilitasnya:

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;
}})()};

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

Info lebih lanjut: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys

Tetapi jika Anda hanya membutuhkan yang pertama, kami dapat mengatur solusi yang lebih pendek seperti:

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

Untuk mendapatkan nama kunci pertama dalam objek yang dapat Anda gunakan:

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

Mengembalikan string, jadi Anda tidak dapat mengakses objek bersarang jika ada, seperti:

var obj = { first: { someVal : { id : 1} }; Di sini dengan solusi itu Anda tidak dapat mengakses id.

Solusi terbaik jika Anda ingin mendapatkan objek yang sebenarnya adalah menggunakan lodash seperti:

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

Untuk mengembalikan nilai kunci pertama, (jika Anda tidak tahu persis nama kunci pertama):

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

jika Anda tahu nama kuncinya cukup gunakan:

obj.first

atau

obj['first']
Diego Unanue
sumber
0

Jika Anda perlu mengakses "properti pertama dari suatu objek", itu mungkin berarti ada sesuatu yang salah dengan logika Anda. Urutan properti objek seharusnya tidak menjadi masalah.

Flavius ​​Stef
sumber
Kamu benar. Saya tidak perlu yang pertama, tapi itu hanya salah satu properti foo sehingga saya bisa bekerja dengannya. Aku hanya perlu satu dan tidak yakin apakah ada cara hanya untuk meraih "pertama" satu tanpa menggunakan untuk ... di.
atogle
0

Gunakan array daripada objek (kurung siku).

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

Perhatikan bahwa Anda kehilangan pengidentifikasi 'foo'. Tapi Anda bisa menambahkan properti nama ke objek yang terkandung:

var example = [ 
  {name: 'foo1', /* stuff1 */},
  {name: 'foo2', /* stuff2 */},
  {name: 'foo3', /* stuff3 */}
];
var whatWasFirst = example[0].name;
kapal uap25
sumber
ada situasi di mana kita tidak bisa. Kami berasumsi bahwa kami tidak dapat mengubah fakta bahwa mereka tidak ada dalam array
1mike12
1
Saya pikir ini berguna untuk mendorong kembali desain sedikit untuk pembaca yang dapat mengontrol skema JSON mereka. Pada dasarnya, saya memperluas jawaban Flavius ​​Stef dengan beberapa contoh.
kapal uap25
0

Ada alasan untuk tidak melakukan ini?

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

(3) ["foo1", "foo2", "foo3"]
jtr13
sumber
8
Karena .map()hanya ada untuk iterables bawaan
kano
0

Anda dapat menggunakan Object.prototype.keysyang mengembalikan semua kunci suatu objek dalam urutan yang sama. Jadi jika Anda menginginkan objek pertama, dapatkan saja array itu dan gunakan elemen pertama sebagai kunci yang diinginkan.

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
akash kumar
sumber
1
Saat menjawab pertanyaan lama, jawaban Anda akan jauh lebih berguna bagi pengguna StackOverflow lain jika Anda menyertakan beberapa konteks untuk menjelaskan bagaimana jawaban Anda membantu, terutama untuk pertanyaan yang sudah memiliki jawaban yang diterima. Lihat: Bagaimana saya menulis jawaban yang bagus .
David Buck
0

kita juga bisa melakukan pendekatan ini.

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

Inilah cara yang lebih bersih untuk mendapatkan kunci pertama:

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]}`)

Ntiyiso Rikhotso
sumber
Tetapi mengapa array sekitar [first]. Pengguna tidak meminta array sebagai jawabannya. Mengapa melakukan ini first = Object.keys(example)[0]yang akan melakukan hal yang sama tanpa perlu membungkus jawabannya dalam sebuah array. Mengapa milikmu lebih bersih?
Michael Durrant
Itu adalah pengembang
penataan yang merusak.mozilla.org/en-US/docs/Web/JavaScript/Reference/…