Javascript nesnesinin ilk özelliğine nasıl erişilir?


611

Bir nesnenin ilk özelliğine erişmenin zarif bir yolu var mı?

  1. mülklerinizin adını bilmediğiniz yerler
  2. for .. injQuery gibi bir döngü kullanmadan$.each

Örneğin, foo1foo1 adını bilmeden nesneye erişmek gerekiyor :

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

1
muhtemelen önce
Array'a

Yanıtlar:


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

Bunu kullanarak dizinlere göre diğer özelliklere de erişebilirsiniz. Dikkatli olun tho! Object.keysiade emri ECMAScript'e göre garanti edilmez, ancak gayri resmi olarak tüm büyük tarayıcı uygulamaları tarafından yapılır, lütfen bununla ilgili ayrıntılar için https://stackoverflow.com/a/23202095 adresini okuyun .


25
Bunun en hızlı yol olmadığını söylüyorsun. Hangi yol daha hızlı olurdu?
T Nguyen

3
Bu, nesnenin tüm anahtarlarının bir dizisini oluşturduğundan çok verimli değildir.
Andrew Mao

9
@T Nguyen bilseydim
gönderirim

5
@DavChana - Kıyaslamanız yanlış yapılmış. Demirbaş blok hep idam ve edilecek blok 2 ilk sonucu, yani boştu yürütme temsil klişe + Block1 ve ikinci sonuç sadece temsil klişe . İşte doğru kıyaslama: http://jsben.ch/#/R9aLQ , hemen hemen eşit olduklarını gösteriyor (testi birkaç kez çalıştırın).
myfunkyside

9
Keşke first()ya da benzeri bir şey bunun üstesinden gelebilir.
Fr0zenFyr

113

for … inDöngüyü deneyin ve ilk yinelemeden sonra kırın:

for (var prop in object) {
    // object[prop]
    break;
}

1
Bence bu tek seçenek. Özellikler olsa da öngörülebilir / yararlı bir sırayla yineleneceğini garanti emin değilim. Yani, foo1 isteyebilirsiniz ama foo3 alın. Özellikler örnekteki gibi numaralandırılmışsa, '1' ile biten tanımlayıcıyı belirlemek için bir dize karşılaştırması yapabilirsiniz. Sonra yine, sıralılık koleksiyonun ana endişesi ise, muhtemelen bir nesne yerine bir dizi kullanmalısınız.
steamer25

2
Başka bir kişi siparişle ilgili endişeli ise, çoğu tarayıcı tahmin edilebilir şekilde davranır: stackoverflow.com/questions/280713/…
Flash

6
var prop; (nesnede prop) kırılması için; // object [prop]
netiul

12
Eski cevap ama. Özelliğin nesneye ait olup olmadığını kontrol etmek isteyebilirsiniz. gibi: for (..) {if (! obj.hasOwnProperty (prop)) devam ederse; .... sonu; } nesnenin gerçekten boş olması durumunda, prototipi veya başka bir şeyi geçmez.
pgarciacamou


46

Object.keysBir nesnedeki özellik dizisini almak için kullanın . Misal:

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

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

Burada sağlanan belgeler ve tarayıcılar arası şim . Onun kullanımıyla ilgili bir örnek benim cevap diğerinde bulunabilir burada .

Düzenleme : netlik için, sadece diğer cevaplarda doğru bir şekilde ifade edilen yankı istiyorum: javascript nesneleri anahtar sırası tanımsız.


25

Tek kurallı bir sürüm:

var val = example[function() { for (var k in example) return k }()];

2
Bazen , nesne programlı olarak eklenmiş diğer istenmeyen değerleri içerdiğinden for inkontrol etmeden kullanmak riskli hasOwnPropertyolabilir, böylece bu snippet'ten istenmeyen bir sonuç elde edebilirsiniz. Kısa ve düzenli olması güvenli optimal anlamına gelmez.
Javier Cobos

24

"İlk" mülk yok. Nesne anahtarları sırasız.

İçin üstlerine Eğer döngü halinde (var foo in bar)siz bunları alacak bazı sırayla, ancak gelecekte değişebilir (özellikle eklemek veya diğer anahtarlarını kaldırmak ise).


Muhteşem. Ekleme sırasını koruyan bir harita uygulamak için bir nesne kullanıyorum. Bir sonraki değeri ekleme boşluğu doldurduğundan, bir değeri kaldırdığımda bu kesiliyor. :(
David Harkness

2
anahtar / değer sırası JS'nin yeni sürümlerinde korunmalıdır
Alexander Mills

11

Lodash kütüphanesi ile çözüm :

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

ancak javascript VM uygulamasına bağlı olduğundan, nesne özellikleri dahili depolama siparişinin garantisi yoktur.


2
Sadece bunu test ettim ve işe yaramıyor. Anahtar / değer çiftini değil, yalnızca değeri döndürür.
Chris Haines

2
Soruda anahtar / değer çiftini döndürmesi gerektiğine dair bir söz yok, sadece nesneyi soruyor ve kabul edilen cevap bu lodash işlevi kadar yapıyor: first özelliğinin içeriğini döndürüyor. Özel ihtiyaçlarınıza uygun olmayabilir, ancak bu soru orijinal soruya göre doğrudur.
Carrm

Evet, nesnenizin sadece bir çocuk nesnesi olacağını bildiğinizde işe yararvar object = { childIndex: { .. } }; var childObject = _.find(Object);
Raja Khoury

9

Hayır. MDC tarafından tanımlanan bir nesne değişmez değeri:

küme parantezleri ({}) içine alınmış sıfır veya daha fazla çift özellik adı ve bir nesnenin ilişkili değerlerinin bir listesi.

Bu nedenle, nesne değişmezi bir dizi değildir ve özelliklere yalnızca açık adlarını veya anahtar kelimeyi forkullanarak bir döngü kullanarak erişebilirsiniz in.


25
Bu cevapta yalnızca yeşil onay işaretini gören başkaları için, sayfanın aşağısında 350 güncel oy bulunan başka bir çözüm daha var.
redfox05

7

En iyi yanıt tüm diziyi oluşturabilir ve ardından listeden yakalayabilir. İşte başka bir etkili kısayol

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

3

Bu daha önce burada ele alınmıştı.

İlk kavramı nesne özellikleri için geçerli değildir ve bir for ... in döngüsünün sırası teknik özellikler tarafından garanti edilmez, ancak pratikte krom için kritik olanlar dışında ( hata raporu ) güvenilir bir şekilde FIFO'dur . Kararlarınızı buna göre verin.


3

Eski IE sürümlerinde desteklenmediğinden Object.keys kullanmanızı önermiyorum. Ancak buna gerçekten ihtiyacınız varsa, geri uyumluluğu garanti etmek için yukarıdaki kodu kullanabilirsiniz:

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

Firefox (Gecko) 4 (2.0) Chrome 5 Internet Explorer 9 Opera 12 Safari 5 Özelliği

Daha fazla bilgi: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys

Ancak sadece ilkine ihtiyacınız varsa, daha kısa bir çözüm ayarlayabiliriz:

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

2

Nesnedeki ilk anahtar adını almak için şunları kullanabilirsiniz:

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

Bir dize döndürür, böylece varsa iç içe nesnelere erişemezsiniz:

var obj = { first: { someVal : { id : 1} }; Burada bu çözümle kimliğe erişemezsiniz.

Gerçek nesneyi elde etmek istiyorsanız en iyi çözüm aşağıdaki gibi kullanmaktır:

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

İlk anahtarın değerini döndürmek için (ilk anahtar adını tam olarak bilmiyorsanız):

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

Anahtar adını biliyorsanız sadece şunu kullanın:

obj.first

veya

obj['first']

0

"Bir nesnenin ilk özelliğine" erişmeniz gerekiyorsa, mantığınızla ilgili bir sorun olduğu anlamına gelebilir. Bir nesnenin özelliklerinin sırası önemli olmamalıdır.


Haklısın. Birincisine ihtiyacım yok, sadece foo özelliklerinden sadece biri, bu yüzden onunla çalışabilirim. Ben sadece birine ihtiyacım var ve sadece kullanmadan önce "ilk" bir kapmak için bir yol olup olmadığından emin değildi.
atogle

0

Nesne yerine bir dizi kullanın (köşeli ayraçlar).

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

'Foo' tanımlayıcılarını kaybettiğinizi unutmayın. Ancak içerilen nesnelere bir ad özelliği ekleyebilirsiniz:

var example = [ 
  {name: 'foo1', /* stuff1 */},
  {name: 'foo2', /* stuff2 */},
  {name: 'foo3', /* stuff3 */}
];
var whatWasFirst = example[0].name;

yapamayacağımız durumlar var. Bir dizide olmadıkları gerçeğini değiştiremeyeceğimizi varsayıyoruz
1mike12

1
JSON şemasını kontrol edebilen okuyucular için tasarıma biraz geri dönmek yararlı olduğunu düşünüyorum. Aslında Flavius ​​Stef'in cevabını bazı örneklerle genişletiyorum.
steamer25


0

Object.prototype.keysBir nesnenin tüm anahtarlarını aynı sırada döndüren tuşunu kullanabilirsiniz . İlk nesneyi istiyorsanız o diziyi alın ve ilk öğeyi istediğiniz anahtar olarak kullanın.

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

1
Eski bir soruyu cevaplarken, özellikle de zaten kabul edilmiş bir cevabı olan bir soru için, cevabınızın nasıl yardımcı olduğunu açıklamak için bir bağlam eklediyseniz, cevabınız diğer StackOverflow kullanıcıları için çok daha yararlı olacaktır. Bakınız: İyi bir cevabı nasıl yazarım .
David Buck

0

bu yaklaşımla da yapabiliriz.

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

0

İlk anahtarı almanın daha temiz bir yolu:

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


Ama neden diziyi [first]. Kullanıcı cevap olarak bir dizi istemedi. Neden bunu first = Object.keys(example)[0]bir dizide sarmaya gerek kalmadan aynı şeyi yapacak. Seninki neden daha temiz?
Michael Durrant

Bu bir yıkıcı ödev geliştiricisi
.mozilla.org/tr
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.