Bir nesnenin ilk dizinini alma


201

Düşünmek:

var object = {
  foo: {},
  bar: {},
  baz: {}
}

Bunu nasıl yaparım:

var first = object[0];
console.log(first);

Açıkçası, bu işe yaramaz çünkü ilk dizin adlandırılır foo, değil 0.

console.log(object['foo']);

çalışır, ama bunun foo adını bilmiyorum. Herhangi bir şey olarak adlandırılabilir. Sadece ilkini istiyorum.

Yanıtlar:


61

Nesnelerin sırası önemliyse, nesneleri bir dizide saklamak için JSON şemanızı gözden geçirmelisiniz:

[
    {"name":"foo", ...},
    {"name":"bar", ...},
    {"name":"baz", ...}
]

ya da belki:

[
    ["foo", {}],
    ["bar", {}],
    ["baz", {}]
]

Ben Alpert'in işaret ettiği gibi, Javascript nesnelerinin özellikleri sıralanmamıştır ve nesnenin değişmezinde belirtilen sırayla numaralandırılmalarını beklerseniz kodunuz bozulur - "ilk" özellik yoktur.


6
(Ben obj olarak) işleri farklı bir sırayla yapmak için hiç görmedim, bazen (ben objede) için işleri farklı bir sıraya sokacağını mı söylüyorsun?
Ryan Florence,

4
Bunu yapmak mümkündür. Teknik özellikler, belirli bir sıraya göre numaralandırılması gerekmediğini söylüyor. Bu hemen hemen bu düzenin değişebileceği anlamına gelir.
PatrikAkerstrand

5
Günümüzde çoğu tarayıcı ekleme talimatını koruyor, ancak durum her zaman böyle değildi; teknik özellik gerektirmez ve Chrome'un kampanya siparişini korumayan yeni sürümleri vardı.
Miles

1
Yaptığım şeylerin derinliğine inerken, şeylerin sırası daha da önemli hale geldi (sadece ilkini önemsediğimi düşündüm, ama yanılmışım!) Bu yüzden önerdiğim gibi nesnelerimi bir dizide saklamak açıktı.
Ryan Florence

1
Nesnenin yalnızca bir öğesi olduğunu biliyorsanız, sıralamayı bilirsiniz.
danorton

329

Sadece eğlence için bu JS 1.8.5'te çalışır

var obj = {a: 1, b: 2, c: 3};
Object.keys(obj)[0]; // "a"

Bu, gördüğünüz sıralamayla eşleşir

for (o in obj) { ... }

24
Taş Devri backword uyumluluğu gerekmedikçe en iyi seçenek açıktır.
Dag Sondre Hansen

1
% 100 en iyi cevap. Bunu yapmanın en kolay ve en hızlı yolu budur.
Dava

3
Sadece açıklığa kavuşturmak için, en.wikipedia.org/wiki/JavaScript#Version_history JS 1.8.5'e göre IE9 öncesi desteklenmemektedir. Ne yazık ki birçok insan hala taş çağında.
Noremac

Muhteşem bir tane. Kısa ve basit. @Jacob
Sariban D'Cl

birisi IE9 kullanıyorsa 😏 acısını hissediyorum. teşekkürler bu şaşırtıcı
CMS

204

Kısa bir şey istiyorsanız şunu deneyin:

for (first in obj) break;

alert(first);

bir fonksiyon olarak sarılmış:

function first(obj) {
    for (var a in obj) return a;
}

8
Aşağıdaki Luke Schafer cevabına bakın, prototip üyelerini almamanızı sağlamak için hasOwnProperty yöntemini kullanır.
Komutan Komutanı

3
IE8 ve altı da dahil olmak üzere tüm tarayıcılarda bir astarın çalışması için for (var key in obj) if (obj.hasOwnProperty(key)) break;O zaman keydeğişkeni kullanmak istersiniz
Ally

ilk öğe bir nesne türüyse çalışmaz. 0
kar

Object.keys(obj)[0];(1.644ms) değerinden çok daha hızlıdır for(0.072ms).
Sebastian Ortmann

77

gerçekten sipariş edilmiyorlar , ancak şunları yapabilirsiniz:

var first;
for (var i in obj) {
    if (obj.hasOwnProperty(i) && typeof(i) !== 'function') {
        first = obj[i];
        break;
    }
}

.hasOwnProperty()örneklenmekte nesneleri göz ardı etmek önemlidir.


Yukarıdaki kodda bir hata var.
Typeof

@Napalm sözdiziminde değil, kontrol edilen değişken adındaki hatayı ifade ediyordu. Haklısın, ancak birçok kişi okunabilirlik için basamaklamayı seviyor
Luke Schafer

Teşekkür ederim. İnanılmaz.
Santosh

76

Javascript nesneleri sırasız olduğundan ilkini vermeyeceksiniz, ancak bazı durumlarda bu iyi.

myObject[Object.keys(myObject)[0]]

39

nesnenin ilk anahtarı için kullanabilirsiniz

console.log(Object.keys(object)[0]);//print key's name

değer için

console.log(object[Object.keys(object)[0]]);//print key's value

18

İlk öğeyi almanın bir yolu yoktur, JavaScript'te "karmalar" (nesneler) sıralanmamış özelliklere sahiptir. En iyi seçeneğiniz, anahtarları bir dizide saklamaktır:

var keys = ["foo", "bar", "baz"];

Ardından uygun değeri elde etmek için bunu kullanın:

object[keys[0]]

16

ES6

const [first] = Object.keys(obj)

Çalışıyor, ancak bunun nasıl çalıştığını açıklayabilir misiniz? Sadece kodun gösterilmesi onu anlamamı sağlıyor.
Daan

1
Bu bir yıkıcı ödev . Temel olarak, döndürülen dizinin ilk öğesini köşeli parantez içindeki değişkene atar.
Richard Ayotte

12

Alt çizgi kullanarak _.pairs komutunu kullanarak ilk nesne girişini aşağıdaki gibi bir anahtar değer çifti olarak alabilirsiniz:

_.pairs(obj)[0]

Daha sonra anahtar başka bir [0]alt simge ile kullanılabilir ,[1]


Underscore.js kullanıldığında en iyi sonucu verir. Tam ihtiyacım olan şey ... Teşekkürler George!
Goldengalaxy

10

Dün aynı sorunu yaşadım. Ben böyle çözdüm:

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.

En zarif çözüm değil ve farklı tarayıcılarda farklı sonuçlar verebileceğinden eminim (yani özellikler, özellikleri tanımlandıkları sırayla numaralandırmak için numaralandırmanın gerekli olmadığını söylüyor). Ancak, benim nesne sadece bir özelliği vardı, bu yüzden bir sorun değildi. Sadece ilk anahtara ihtiyacım vardı.


1
Merhaba @PatrikAkerstrand erken Yanlışlıkla aşağıya tıkladım. Lütfen geri almak için anwser'ınızda herhangi bir değişiklik yapın. Afedersiniz.
rogeriolino

7

Böyle bir şey yapabilirsiniz:

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'} )

6

Nesnenizin ilk anahtarını almak için

const myObject = {
   'foo1': { name: 'myNam1' },
   'foo2': { name: 'myNam2' }
}

const result = Object.keys(myObject)[0];

// result will return 'foo1'

Bu cevabın Yakup'un cevabına farkı nedir?
YakovL

taze, bu tür kodların mükemmel çalıştığından emin olur.
Santosh

5

Dayanarak CMS cevap . Değeri doğrudan almıyorum, bunun yerine anahtar dizininde almak ve değeri almak için kullanın:

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'

2

Çözümüm:

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

12
güzel, sadece… kodlama tarzınız! ne oluyor be? bu diş telleri her yerde!
uçan koyun

2
Python stilini biliyor musunuz? Python stiline dikey hizalanmış parantez ekledim. Her neyse, "Cehennem başkalarıdır", :-D
diyizm
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.