Akses properti Objek non-numerik menurut indeks?

88

Jika saya memiliki array seperti ini:

var arr = ['one','two','three'];

Saya dapat mengakses bagian yang berbeda dengan melakukan ini:

console.log(arr[1]);

Bagaimana cara mengakses properti objek berdasarkan urutannya, bukan berdasarkan kunci?

Contoh:

var obj = {
    'something' : 'awesome',
    'evenmore'  : 'crazy'
},
jbo = {
    'evenmore'  : 'crazy',
    'something' : 'awesome'
};

Bagaimana saya mendapatkan properti pertama untuk setiap objek– "sesuatu" dari objdan "bahkan lebih" dari jbo–tanpa menggunakan nama properti secara eksplisit?

Sekarang, beberapa dari Anda sepertinya berpikir saya mencari sesuatu seperti:

console.log(obj['something']);

Ini bukan masalahnya, saya secara khusus ingin menargetkan indeks, seperti contoh pertama - jika memungkinkan.

daryl
sumber
2
Apa yang Anda maksud dengan "Larik objek". Array adalah sebuah objek. Apakah yang Anda maksud hanyalah sebuah objek yang bukan sebuah array, atau yang Anda maksud adalah sebuah array dari objek. Dan bagaimana faktor jQuery dalam pertanyaan Anda? Contoh kode Anda hanya menggambarkan bagian yang sudah Anda ketahui cara melakukannya. Bagaimana dengan memberikan beberapa kode yang menggambarkan masalah tersebut .
pengguna113716
@ Ӫ _._ Ӫ Alasan saya menandai jQuery adalah untuk mendapatkan audiens yang lebih luas, saya pikir siapa pun yang tahu jQuery harus memiliki pemahaman tentang array, tidak bertentangan dengan pertanyaan saya, ini adalah barang-barang buku teks.
daryl
4
Sebenarnya menurut saya ada lebih banyak orang yang "mengetahui" jQuery dan tidak mengetahui JavaScript daripada sebaliknya (setidaknya orang yang tahu JavaScript seharusnya dapat memahami jQuery dengan mudah) .... dan sehubungan dengan pertanyaan Anda yang sebenarnya: Tidak, Anda tidak dapat mengakses properti objek dengan indeks. Mereka tidak diperintahkan.
Felix Kling
2
"... Saya pikir siapa pun yang tahu jQuery pasti memiliki pemahaman tentang array ..." Saya tidak akan bertaruh.
pengguna113716
1
@ Programmer: pertanyaan ini tidak ada hubungannya dengan jQuery, jadi tag jQuery tidak pantas.
outis

Jawaban:

127

"Saya secara khusus ingin menargetkan indeks, seperti contoh pertama - jika memungkinkan."

Tidak, itu tidak mungkin.

Yang paling dekat yang bisa Anda dapatkan adalah mendapatkan Array dari kunci objek, dan menggunakannya:

var keys = Object.keys( obj );

... tetapi tidak ada jaminan bahwa kunci akan dikembalikan dalam urutan yang Anda tentukan. Jadi itu bisa berakhir seperti:

keys[ 0 ];  // 'evenmore'
keys[ 1 ];  // 'something'
pengguna113716
sumber
6
Object.keys()dapat digunakan dengan andal jika Anda mengetahui konten objek. Lebih detail di sini: stackoverflow.com/questions/280713/…
cronoklee
3
Metode Object.keys () mengembalikan larik properti enumerabel dari objek tertentu, dalam urutan yang sama seperti yang disediakan oleh for ... in loop (perbedaannya adalah loop for-in menyebutkan properti dalam rantai prototipe sebagai baik). developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Amr Ragaey
6
semuanya mungkin
Cas Bloem
48

Satu-satunya cara yang dapat saya pikirkan untuk melakukan ini adalah dengan membuat metode yang memberi Anda properti yang digunakan Object.keys();.

var obj = {
    dog: "woof",
    cat: "meow",
    key: function(n) {
        return this[Object.keys(this)[n]];
    }
};
obj.key(1); // "meow"

Demo: http://jsfiddle.net/UmkVn/

Ini akan memungkinkan untuk memperluas ini ke semua objek menggunakan Object.prototype;tetapi itu biasanya tidak disarankan.

Sebagai gantinya, gunakan pembantu fungsi:

var object = {
  key: function(n) {
    return this[ Object.keys(this)[n] ];
  }
};

function key(obj, idx) {
  return object.key.call(obj, idx);
}

key({ a: 6 }, 0); // 6
0x499602D2
sumber
1
Ini keren & bekerja seperti pesona! Mengapa ini bukan jawaban yang diterima? Anda mungkin harus menggunakannya return this[Object.keys(this)[n]];untuk membuatnya generik.
cronoklee
3
Halo dari 2016, kami orang-orang masa depan masih berpikir ini harus menjadi jawaban yang diterima. Solusi hebat
mhodges
Alasan ini bukan jawaban yang diterima karena hingga es6, urutan Object.keys tidak dijamin. Jadi, meskipun kode itu berfungsi di beberapa mesin JS, itu tidak dijamin berfungsi di semuanya. stackoverflow.com/questions/5525795/…
ptoinson
13

Anda dapat menggunakan Object.values()metode ini jika Anda tidak ingin menggunakan Object.keys().

Berbeda dengan Object.keys()metode yang mengembalikan array dari properti enumerable objek tertentu, jadi misalnya:

const object1 = {
 a: 'somestring',
 b: 42,
 c: false
};

console.log(Object.keys(object1));

Akan mencetak array berikut:

[ 'a', 'b', 'c' ]

The Object.values()Metode mengembalikan array properti enumerable objek diberikan sendiri values.

Jadi, jika Anda memiliki objek yang sama tetapi menggunakan nilai,

const object1 = {
 a: 'somestring',
 b: 42,
 c: false
};

console.log(Object.values(object1));

Anda akan mendapatkan array berikut:

[ 'somestring', 42, false ]

Jadi jika Anda ingin mengakses object1.b, tetapi menggunakan indeks, Anda dapat menggunakan:

Object.values(object1)[1] === 42

Anda dapat membaca lebih lanjut tentang metode ini di sini .

Arthur Senna
sumber
1
Cara yang disarankan dalam topik ini tampaknya yang terpendek dan paling elegan.
Petro Franko
5
var obj = {
    'key1':'value',
    '2':'value',
    'key 1':'value'
}

console.log(obj.key1)
console.log(obj['key1'])
console.log(obj['2'])
console.log(obj['key 1'])

// will not work
console.log(obj.2)

Edit:

"Saya secara khusus ingin menargetkan indeks, seperti contoh pertama - jika memungkinkan."

Sebenarnya 'indeks' adalah kuncinya. Jika Anda ingin menyimpan posisi kunci, Anda perlu membuat objek khusus untuk menangani ini.

cuzzea.dll
sumber
Saya tahu bahwa Anda dapat mengaksesnya dengan kunci, bukan itu yang saya tanyakan.
daryl
@ Pemrogram: pertanyaan Anda ambigu, jadi posting ini berpotensi menjawab pertanyaan seperti yang tertulis.
outis
2

dengan jquery Anda dapat melakukan ini:

var arr = $.map(obj,function(value, key) {
    return value;
});
alert(obj[0]);
Meysam Khoshbakht
sumber
2

Dapatkan array kunci, balikkan, lalu jalankan loop Anda

  var keys = Object.keys( obj ).reverse();
  for(var i = 0; i < keys.length; i++){
    var key = keys[i];
    var value = obj[key];
    //do stuff backwards
  }
Kareem
sumber
1

Anda dapat membuat array yang diisi dengan bidang objek Anda dan menggunakan indeks pada array dan mengakses properti objek melalui itu

propertiesName:['pr1','pr2','pr3']

this.myObject[this.propertiesName[0]]
arfa
sumber
1

Saya melanjutkan dan membuat fungsi untuk Anda:

 Object.prototype.getValueByIndex = function (index) {
     /*
         Object.getOwnPropertyNames() takes in a parameter of the object, 
         and returns an array of all the properties.
         In this case it would return: ["something","evenmore"].
         So, this[Object.getOwnPropertyNames(this)[index]]; is really just the same thing as:
         this[propertyName]
    */
    return this[Object.getOwnPropertyNames(this)[index]];
};

let obj = {
    'something' : 'awesome',
    'evenmore'  : 'crazy'
};

console.log(obj.getValueByIndex(0)); // Expected output: "awesome"

StackGeek
sumber
1
Bisakah Anda menjelaskan apa yang dilakukan dalam pendekatan Anda?
Rahul Bhobe
Saya menambahkan beberapa komentar di kode, sehingga Anda dapat memahami apa yang sedang dilakukan.
StackGeek
0

Jika Anda tidak yakin Object.keys () akan mengembalikan Anda kunci dalam urutan yang benar, Anda dapat mencoba logika ini sebagai gantinya

var keys = []
var obj = {
    'key1' : 'value1',
    'key2' : 'value2',
    'key3' : 'value3',
}
for (var key in obj){
    keys.push(key)
}
console.log(obj[keys[1]])
console.log(obj[keys[2]])
console.log(obj[keys[3]])
Thiago Loddi
sumber