Nesneleri içeren bir dizi arasında nasıl döngü yapılır ve özelliklerine nasıl erişilir


190

Bir dizi içinde yer alan nesneler arasında döngü ve her birinin özelliklerini değiştirmek istiyorum. Bunu yaparsam:

for (var j = 0; j < myArray.length; j++){

console.log(myArray[j]);

}

Konsol dizideki her nesneyi getirmeli, değil mi? Ama aslında sadece ilk nesneyi görüntüler. diziyi döngü dışında günlüğe kaydedersem, tüm nesneler görünür, bu yüzden orada daha fazlası vardır.

Her neyse, işte bir sonraki sorun. Döngüyü kullanarak dizideki Object1.x dosyasına nasıl erişebilirim?

for (var j = 0; j < myArray.length; j++){

console.log(myArray[j.x]);

}

Bu, "tanımsız" değerini döndürür. Yine döngünün dışındaki konsol günlüğü, nesnelerin hepsinin "x" için değerlere sahip olduğunu söyler. Döngüdeki bu özelliklere nasıl erişirim?

Her yerde ayrı diziler kullanmak için başka bir yerde tavsiye edildi, ama önce bu caddeyi tükettiğimden emin olmak istiyorum.

Teşekkür ederim!


2
Dizinizin bir örneğini gönderebilir misiniz? İlk kod snippet'i doğru görünüyor.
Sirko

jbir sayıdır. Döngünüzün en üstünde tanımladınız.

2
Belki myArraysonuçta sadece bir dizi değil?
techfoobar


Aşağıdaki tüm cevaplarla ve kabul edilen bir cevapla, kimse sorunun neden oluştuğunu ve bunun döngü için nasıl çözüleceğini açıklamaz. #forEachİşler. Ama soru döngü içindi.
FreeLightman

Yanıtlar:


341

ForEach kullanın onun yerleşik bir dizi işlevi. Array.forEach():

yourArray.forEach(function (arrayItem) {
    var x = arrayItem.prop1 + 2;
    console.log(x);
});

2
yardım sevindim .. Javascript oldukça serin hale geliyor ... artı forEach karmaşık döngüler okumak çok daha iyi ve daha kolay ..
Dory Zidon 18:13

3
Korkarım forEachIE 9'da desteklenmiyor. Beni suçlama! İşverenimin ürünü buna destek veriyor!
fatCop

1
@DoryZidon: forEach mola veya durdurmayı desteklemiyor - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Ankur Loriya

2
Gerçekten bir dizi olması önemlidir. Böyle bir yourArrayşey document.getElementsByClassNamevarsa, bir dizi değil, bir HTMLC koleksiyonu olurdu. O zaman bu soru yardımcı olabilir.
J0ANMM

Not: forEachengelliyor ve desteklemeyen awaithayranlarıyla for...ofdöngü irade.
PotatoFarmer

108

Bazıları JavaScript'te işlevsel programlama yolunda bir dizi üzerinden döngü halini kullanır :

1. Sadece bir dizi üzerinden döngü

const myArray = [{x:100}, {x:200}, {x:300}];

myArray.forEach((element, index, array) => {
    console.log(element.x); // 100, 200, 300
    console.log(index); // 0, 1, 2
    console.log(array); // same myArray object 3 times
});

Not: Array.prototype.forEach (), giriş parametresi olarak aldığı işlevin saf bir işlev olarak kabul edilemeyen bir değer döndürmesi gerekmediğinden, kesin olarak konuşmak için işlevsel bir yol değildir.

2. Bir dizideki elemanlardan herhangi birinin bir testi geçip geçmediğini kontrol edin

const people = [
    {name: 'John', age: 23}, 
    {name: 'Andrew', age: 3}, 
    {name: 'Peter', age: 8}, 
    {name: 'Hanna', age: 14}, 
    {name: 'Adam', age: 37}];

const anyAdult = people.some(person => person.age >= 18);
console.log(anyAdult); // true

3. Yeni bir diziye dönüştürün

const myArray = [{x:100}, {x:200}, {x:300}];

const newArray= myArray.map(element => element.x);
console.log(newArray); // [100, 200, 300]

Not: map () yöntemi, çağıran dizideki her öğede sağlanan bir işlevi çağırmanın sonuçlarıyla yeni bir dizi oluşturur.

4. Belirli bir mülkü toplayın ve ortalamasını hesaplayın

const myArray = [{x:100}, {x:200}, {x:300}];

const sum = myArray.map(element => element.x).reduce((a, b) => a + b, 0);
console.log(sum); // 600 = 0 + 100 + 200 + 300

const average = sum / myArray.length;
console.log(average); // 200

5. Orijinali temel alan ancak değiştirmeden yeni bir dizi oluşturun

const myArray = [{x:100}, {x:200}, {x:300}];

const newArray= myArray.map(element => {
    return {
        ...element,
        x: element.x * 2
    };
});

console.log(myArray); // [100, 200, 300]
console.log(newArray); // [200, 400, 600]

6. Her kategorinin sayısını sayın

const people = [
    {name: 'John', group: 'A'}, 
    {name: 'Andrew', group: 'C'}, 
    {name: 'Peter', group: 'A'}, 
    {name: 'James', group: 'B'}, 
    {name: 'Hanna', group: 'A'}, 
    {name: 'Adam', group: 'B'}];

const groupInfo = people.reduce((groups, person) => {
    const {A = 0, B = 0, C = 0} = groups;
    if (person.group === 'A') {
        return {...groups, A: A + 1};
    } else if (person.group === 'B') {
        return {...groups, B: B + 1};
    } else {
        return {...groups, C: C + 1};
    }
}, {});

console.log(groupInfo); // {A: 3, C: 1, B: 2}

7. Belirli ölçütlere göre bir dizinin alt kümesini alma

const myArray = [{x:100}, {x:200}, {x:300}];

const newArray = myArray.filter(element => element.x > 250);
console.log(newArray); // [{x:300}] 

Not: filter () yöntemi, sağlanan işlev tarafından uygulanan sınamayı geçen tüm öğeleri içeren yeni bir dizi oluşturur.

8. Diziyi sıralama

const people = [
  { name: "John", age: 21 },
  { name: "Peter", age: 31 },
  { name: "Andrew", age: 29 },
  { name: "Thomas", age: 25 }
];

let sortByAge = people.sort(function (p1, p2) {
  return p1.age - p2.age;
});

console.log(sortByAge);

resim açıklamasını buraya girin

9. Dizideki bir öğeyi bulma

const people = [ {name: "john", age:23},
                {name: "john", age:43},
                {name: "jim", age:101},
                {name: "bob", age:67} ];

const john = people.find(person => person.name === 'john');
console.log(john);

resim açıklamasını buraya girin

Array.prototype.find () yöntemi, dizideki sağlanan test işlevini karşılayan ilk öğenin değerini döndürür.

Referanslar


1
Bu harika bir referans - bu sorunun orijinali bu mu yoksa başka bir yerde barındırılan böyle bir şey var mı?
Salvatore

Çok iyi açıklanmış ve kapsamlı bir cevap, katkıda bulunduğunuz için teşekkür ederiz.
Erica Summers

merhaba, tüm adı göstermek ve sonra karşılaştırma yapmak istersem, nasıl yapılacağını biliyor musun?
dipgirl

@dipgirl, aşağıdaki gibi bir şey mi? const people = [ {name: "john", age:23}, {name: "john", age:43}, {name: "jim", age:101}, {name: "bob", age:67} ]; const sortByAge = people.map(p => { console.log(p.name) return p }).sort(function (p1, p2) { return p1.age - p2.age; }); console.log(sortByAge);
Yuci

1
100. oy için tebrik :)
Syed

46

Nesnelerin bir dizi üzerinde döngü için bir for..of döngüsü kullanabilirsiniz .

for (let item of items) {
    console.log(item); // Will display contents of the object inside the array
}

for..ofDöngülerle ilgili en iyi şeylerden biri, dizilerden daha fazlasını yineleyebilmeleridir. Haritalar ve nesneler de dahil olmak üzere her türlü yinelemeyi yineleyebilirsiniz. Eski tarayıcıları desteklemeniz gerekiyorsa bir aktarıcı veya TypeScript gibi bir şey kullandığınızdan emin olun.

Bir harita üzerinde yineleme yapmak istiyorsanız, sözdizimi büyük ölçüde yukarıdakilerle aynıdır, ancak hem anahtarı hem de değeri ele alır.

for (const [key, value] of items) {
  console.log(value);
}

for..ofJavascript'te yaptığım hemen hemen her türlü yineleme için döngüler kullanıyorum . Ayrıca, en havalı şeylerden biri de zaman uyumsuz / beklemede de çalışmasıdır.


29
for (var j = 0; j < myArray.length; j++){
  console.log(myArray[j].x);
}

Yine de bu sadece ikinci sorunun çözümü.
Sirko

18

İşte bunu nasıl yapabileceğinize dair bir örnek :)

var students = [{
    name: "Mike",
    track: "track-a",
    achievements: 23,
    points: 400,
  },
  {
    name: "james",
    track: "track-a",
    achievements: 2,
    points: 21,
  },
]

students.forEach(myFunction);

function myFunction(item, index) {
  for (var key in item) {
    console.log(item[key])
  }
}


trackher bir öğe için özelliğin değerini nasıl elde edersiniz ve onu kodun başka bir bölümünde kullanmak veya enterpolasyon yapmak için bir değişkene nasıl atarsınız?
Chris22

7

Bir dizi nesneyi döngüye sokmak oldukça temel bir işlevselliktir. İşte benim işime yarayan bu.

var person = [];
person[0] = {
  firstName: "John",
  lastName: "Doe",
  age: 60
};

var i, item;

for (i = 0; i < person.length; i++) {
  for (item in person[i]) {
    document.write(item + ": " + person[i][item] + "<br>");
  }
}


6

myArray[j.x] mantıksal olarak yanlış.

(myArray[j].x);Bunun yerine kullan

for (var j = 0; j < myArray.length; j++){
  console.log(myArray[j].x);
}

@ Cyborgx37 Oh .. Yani jx yanlış bir değişken adı olarak kabul edilir.
Vivek Sadh

5

ES5 + 'dan beri forEach yöntemini kullanmak gerçekten çok basit. Dizinizdeki her bir nesnenin her bir özelliğini doğrudan değiştirebilirsiniz.

myArray.forEach(function (arrayElem){ 
  arrayElem = newPropertyValue;
});

Her bir nesnedeki belirli bir özelliğe erişmek istiyorsanız:

myArray.forEach(function (arrayElem){ 
      arrayElem.nameOfYourProperty = newPropertyValue;
    });

4

Bir nesne dizisi üzerinden yinelemenin başka bir yolu da (bunlar için belgenize jQuery kitaplığını eklemeniz gerekir).

$.each(array, function(element) {
  // do some operations with each element... 
});

1
Yanıtınızda $.eachyöntemi kullanmak için jQuery kitaplığını yükleme gereksinimi hakkında kritik bilgiler eksik .
Matthew Morek

4

Bu işe yarar. Kapsamlı dizi döngüsü (diziniz). Sonra her nesnenin (eachObj) doğrudan özellikleri arasında döngü.

yourArray.forEach( function (eachObj){
    for (var key in eachObj) {
        if (eachObj.hasOwnProperty(key)){
           console.log(key,eachObj[key]);
        }
    }
});

2

JQuery kullanarak dizi nesnesi yinelemesi (dizeyi yazdırmak için ikinci parametreyi kullanın).

$.each(array, function(index, item) {
       console.log(index, item);
});

2

var c = {
    myProperty: [
        { name: 'this' },
        { name: 'can' },
        { name: 'get' },
        { name: 'crazy' }
    ]
};

c.myProperty.forEach(function(myProperty_element) {
    var x = myProperty_element.name;
    console.log('the name of the member is : ' + x);
})

Bunu başarabilmemin yollarından biri de bu.


1

Kabul edilen cevap normal işlevi kullanır. Yani aynı kodu forEach üzerindeki ok işlevini kullanarak küçük bir değişiklikle göndermek

  yourArray.forEach(arrayItem => {
      var x = arrayItem.prop1 + 2;
      console.log(x);
  });

Ayrıca $ .each içinde aşağıdaki gibi ok işlevini kullanabilirsiniz

 $.each(array, (item, index) => {
       console.log(index, item);
 });

1

const jobs = [
    {
        name: "sipher",
        family: "sipherplus",
        job: "Devops"
    },
    {
        name: "john",
        family: "Doe",
        job: "Devops"
    },
    {
        name: "jim",
        family: "smith",
        job: "Devops"
    }
];

const txt = 
   ` <ul>
        ${jobs.map(job => `<li>${job.name} ${job.family} -> ${job.job}</li>`).join('')}
    </ul>`
;

document.body.innerHTML = txt;

Sırt kenelerine dikkat edin (`)


0

Bu birine yardımcı olabilir. Belki Düğümde bir hata.

var arr = [ { name: 'a' }, { name: 'b' }, { name: 'c' } ];
var c = 0;

Bu işe yaramaz:

while (arr[c].name) { c++; } // TypeError: Cannot read property 'name' of undefined

Ama bu işe yarıyor ...

while (arr[c]) { c++; } // Inside the loop arr[c].name works as expected.

Bu da işe yarıyor ...

while ((arr[c]) && (arr[c].name)) { c++; }

AMA sadece siparişi tersine çevirmek çalışmıyor. Sanırım burada Düğüm'ü kıran bir tür dahili optimizasyon var.

while ((arr[c].name) && (arr[c])) { c++; }

Hata, dizinin tanımsız olduğunu söylüyor, ancak değil: - / Node v11.15.0

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.