Bir döngüde nesne değişmezleri dizisi nasıl oluşturulur?


224

Bunun gibi nesne değişmezleri bir dizi oluşturmak gerekir:

var myColumnDefs = [
    {key:"label", sortable:true, resizeable:true},
    {key:"notes", sortable:true,resizeable:true},......

Böyle bir döngüde:

for (var i = 0; i < oFullResponse.results.length; i++) {
    console.log(oFullResponse.results[i].label);
}

Değeri dizinin her öğesinde keyolmalıdır results[i].label.

Yanıtlar:


395
var arr = [];
var len = oFullResponse.results.length;
for (var i = 0; i < len; i++) {
    arr.push({
        key: oFullResponse.results[i].label,
        sortable: true,
        resizeable: true
    });
}

18
var obj = {biraz atlayabilirsiniz , sadece değişmezi itin.
Peter Bailey

3
uzunluğu sadece bir kez hesaplamak muhtemelen iyi bir fikirdir, var objkodu daha net hale getirmek için bir eklemeyi seçiyorum , elbette atlayabilirsiniz, isterseniz tüm komut dosyasını bir satıra yazabilirsiniz :)
RaYell

3
@kangax, Uzunluk "hesaplanmaz", O (1) işlemidir.
Triptik

8
@Triptych - Evet, ancak her yinelemeyle yürüttüğünüz, ücretsiz olmayan ve önlenebilecek bir özellik aramasıdır. Mikro optimizasyon? Muhtemelen. Ayrıca, "canlı" bir değerdir - döngüdeki diziyi değiştirirseniz uzunluk, sonsuza yol açabilecek ardışık yinelemelerde değişecektir. Bunu bir saat ver youtube.com/watch?v=mHtdZgou0qU
Peter Bailey

2
Evet, ama diziyi her yinelemede değiştirmiyorsunuz. Eğer olsaydınız, çoğu durumda uzunluğa kıyasla karşılaştırmak saçma olurdu.
Triptik

61

RaYell'in cevabı iyidir - sorunuza cevap verir.

Bana öyle geliyor ki, gerçekten alt nesnelerle etiket olarak anahtarlanmış bir nesne oluşturmalısınız:

var columns = {};
for (var i = 0; i < oFullResponse.results.length; i++) {
    var key = oFullResponse.results[i].label;
    columns[key] = {
        sortable: true,
        resizeable: true
    };
}

// Now you can access column info like this. 
columns['notes'].resizeable;

Yukarıdaki yaklaşım, nesne erişiminin tamamını her erişim için bir anahtar aramaktan çok daha hızlı ve deyimsel olmalıdır.


Temel çözümden bu yana +1, daha mantıklı ve ihtiyaçlarımda bana yardımcı :)
winner_joiner

var anahtarını ayarladıktan sonra noktalı virgül eksik mi?
SuperUntitled

güzel cevap, bir süredir bilgilere nasıl
erişileceğini araştırıyordum

anahtarın birden fazla olması gerekiyorsa ne olacak! ['notlar'] bir kereden fazla ortaya çıkabilir o zaman ne yapabiliriz?
Milson

1
Milson - bu durumda, bu gerçekten bir "anahtar" değil
Triptych

13

ES6'da böyle bir şey yapabilirsiniz.

new Array(10).fill().map((e,i) => {
   return {idx: i}
});


4

Bu çalışacak:

 var myColumnDefs = new Object();
 for (var i = 0; i < oFullResponse.results.length; i++) {
     myColumnDefs[i] = ({key:oFullResponse.results[i].label, sortable:true, resizeable:true});
  }

4

Aynı fikirde Nick Riggs ama ben bir yapıcı oluşturmak ve bir dizi kullanarak onu kullanarak yeni bir nesne itin. Sınıfın anahtarlarının tekrarlanmasını önler:

var arr = [];
var columnDefs = function(key, sortable, resizeable){
    this.key = key; 
    this.sortable = sortable; 
    this.resizeable = resizeable;
    };

for (var i = 0; i < len; i++) {
    arr.push((new columnDefs(oFullResponse.results[i].label,true,true)));
}

3

Diziyi oluşturup nesne değişmezlerini buna eklerdim.

var myColumnDefs = [];

for ( var i=0 ; i < oFullResponse.results.length; i++) {

    console.log(oFullResponse.results[i].label);
    myColumnDefs[myColumnDefs.length] = {key:oFullResponse.results[i].label, sortable:true, resizeable:true};
}


2

ES6 ile @tetra'dan daha da ileri gitmek isterseniz, Object spread sözdizimini kullanabilir ve bunun gibi bir şey yapabilirsiniz:

let john = {
    firstName: "John",
    lastName: "Doe",
};

let people = new Array(10).fill().map((e, i) => {(...john, id: i});
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.