Sayısal olmayan Nesne özelliklerine dizine göre erişilsin mi?


88

Bunun gibi bir dizim varsa:

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

Bunu yaparak farklı bölümlere erişebilirim:

console.log(arr[1]);

Nesne özelliklerine anahtar yerine sıralarına göre nasıl erişebilirim?

Misal:

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

Özellik adını açık bir şekilde kullanmadan her nesne için ilk özelliği - "bir şey" objve "daha fazlası" için nasıl elde edebilirim jbo?

Şimdi, birkaçınız şöyle bir şeyin peşinde olduğumu sanıyor:

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

Durum böyle değil, özellikle ilk örnekte olduğu gibi dizini hedeflemeye çalışıyorum - eğer mümkünse.


2
"Nesne dizisi" ile neyi kastediyorsunuz? Bir dizi olan bir nesne. Sadece dizi olmayan bir nesneyi mi yoksa bir dizi nesneyi mi kastediyorsunuz? Ve jQuery sorunuza nasıl etki ediyor? Tek kod örneğiniz, nasıl yapılacağını zaten bildiğiniz kısmı göstermektedir. Problemi açıklayan bir kod vermeye ne dersiniz ?
user113716

@ Ӫ _._ Ӫ jQuery'yi etiketlememin nedeni daha geniş bir kitle elde etmekti, jQuery'yi bilen herkesin diziler hakkında bir anlayışa sahip olması gerektiğini düşündüm, sorumla çelişmek için değil, ders kitabı meselesi.
daryl

4
Aslında, jQuery'yi "bilen" ve JavaScript'i bilmeyen kişilerin tam tersinden daha fazla olduğunu söyleyebilirim (en azından JavaScript'i bilen kişiler jQuery'yi kolayca anlayabilmelidir) .... ve asıl sorunuzla ilgili olarak: Hayır, siz nesne özelliklerine dizine göre erişilemez. Sıralanmamışlar.
Felix Kling

2
"... jQuery'yi bilen herkesin diziler hakkında bir anlayışa sahip olması gerektiğini düşündüm ..." Buna bahse girmezdim.
user113716

1
@Brogrammer: Bu sorunun jQuery ile ilgisi yoktur, bu nedenle jQuery etiketi uygun değildir.
outis

Yanıtlar:


127

"Mümkünse, tıpkı ilk örnekte olduğu gibi, özellikle dizini hedeflemeyi düşünüyorum."

Hayır, mümkün değil.

En yakın elde edebileceğiniz şey, nesnenin anahtarlarının bir Dizisini almak ve bunu kullanmaktır:

var keys = Object.keys( obj );

... ancak anahtarların tanımladığınız sırayla iade edileceğinin garantisi yoktur. Böylece şöyle görünebilir:

keys[ 0 ];  // 'evenmore'
keys[ 1 ];  // 'something'

6
Object.keys()nesnenin içeriğini biliyorsanız güvenilir bir şekilde kullanılabilir. Daha fazla ayrıntı burada: stackoverflow.com/questions/280713/…
cronoklee

3
Object.keys () yöntemi, bir for ... in döngüsü tarafından sağlananla aynı sırada belirli bir nesnenin kendi numaralandırılabilir özelliklerinin bir dizisini döndürür (aradaki fark, for-in döngüsünün prototip zincirindeki özellikleri şu şekilde numaralandırmasıdır: iyi). developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Amr Ragaey

6
her şey mümkün
Cas Bloem

48

Bunu yapmanın tek yolu, size özelliği kullanarak özelliği veren bir yöntem oluşturmaktır 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/

Bunu kullanan tüm nesnelere genişletmek mümkündür, Object.prototype;ancak bu genellikle tavsiye edilmez.

Bunun yerine, bir işlev yardımcısı kullanın:

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

1
Bu harika ve bir cazibe gibi çalışıyor! Neden kabul edilen cevap değil? Muhtemelen return this[Object.keys(this)[n]];jenerik yapmak için kullanmalısınız .
cronoklee

3
2016'dan merhaba, biz geleceğin halkı hala bunun kabul edilen cevap olması gerektiğini düşünüyoruz. Harika çözüm
mhodges

Kabul edilen cevap olmamasının nedeni es6'ya kadar Object.keys sırasının garanti edilmemesidir. Dolayısıyla, bu kod birkaç JS motorunda çalışsa da, hepsinde çalışacağı garanti edilmez. stackoverflow.com/questions/5525795/…
ptoinson

13

Sen kullanabilirsiniz Object.values()Kullanmak istediğiniz daha dont eğer yöntemObject.keys() .

Object.keys()Belirli bir nesnenin kendi numaralandırılabilir özelliklerinin bir dizisini döndüren yöntemin aksine , örneğin:

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

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

Aşağıdaki diziyi yazdırır:

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

Object.values()Yöntem, belirli bir nesnenin kendi enumerable mülkiyet dizisi döndürürvalues .

Dolayısıyla, aynı nesneye sahipseniz ancak bunun yerine değerleri kullanıyorsanız,

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

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

Aşağıdaki diziyi elde edersiniz:

[ 'somestring', 42, false ]

Öyleyse object1.b, ancak bunun yerine bir dizine erişmek istiyorsanız, şunu kullanabilirsiniz:

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

Bu yöntem hakkında daha fazla bilgi bulabilirsiniz burada .


1
Bu başlıkta önerilen bu yöntem en kısa ve en şık gibi görünmektedir.
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)

Düzenle:

"Mümkünse, tıpkı ilk örnekte olduğu gibi, özellikle dizini hedeflemeyi düşünüyorum."

Aslında 'indeks' anahtardır. Bir anahtarın konumunu saklamak istiyorsanız, bunu işlemek için özel bir nesne oluşturmanız gerekir.


Anahtarla erişebileceğinizi biliyorum, istediğim bu değil.
daryl

@Brogrammer: Sorunuz belirsiz, bu nedenle bu gönderi soruya muhtemelen yazıldığı gibi cevap veriyor.
outis

2

jquery ile bunu yapabilirsiniz:

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

2

Anahtar dizisini alın, ters çevirin, ardından döngünüzü çalıştırın

  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
  }

1

Nesne alanlarınızla doldurulan bir dizi oluşturabilir ve dizi üzerinde bir indeks kullanabilir ve bunun aracılığıyla nesne özelliklerine erişebilirsiniz.

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

this.myObject[this.propertiesName[0]]

1

Devam ettim ve sizin için bir işlev yaptım:

 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"


1
Yaklaşımınızda neler yapıldığını açıklayabilir misiniz?
Rahul Bhobe

Koda bazı yorumlar ekledim, böylece ne yapıldığını anlayabilirsin.
StackGeek

0

Object.keys () 'in size anahtarları doğru sırada döndüreceğinden emin değilseniz, bunun yerine bu mantığı deneyebilirsiniz.

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]])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.