Cum să parcurgeți în buclă un array care conține obiecte și să accesați proprietățile acestora (Programare, Javascript, Array-Uri, Iterație)

Șopârla zburătoare a intrebat.

Vreau să parcurg în ciclu obiectele conținute într-un array și să modific proprietățile fiecăruia dintre ele. Dacă fac acest lucru:

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

console.log(myArray[j]);

}

Consola ar trebui să afișeze fiecare obiect din tablou, corect? Dar, de fapt, afișează doar primul obiect. dacă înregistrez în consolă array-ul în afara buclei, apar toate obiectele, deci cu siguranță sunt mai multe acolo.

Oricum, iată următoarea problemă. Cum accesez, de exemplu, Obiectul1.x din array, folosind bucla?

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

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

}

Aceasta returnează „nedefinit”. Din nou, jurnalul de consolă din afara buclei îmi spune că toate obiectele au valori pentru „x”. Cum pot accesa aceste proprietăți în buclă?

Mi s-a recomandat în altă parte să folosesc array-uri separate pentru fiecare dintre proprietăți, dar vreau să mă asigur că am epuizat mai întâi această cale.

Vă mulțumesc!

Comentarii

  • Poți să postezi o mostră a array-ului tău? Primul fragment de cod pare corect. –  > Por Sirko.
  • j este un număr. L-ați definit în partea de sus a buclei. – user1106925
  • Poate myArray nu este de fapt doar o matrice, până la urmă?? –  > Por techfoobar.
  • avem nevoie de mai multe informații despre cum este construit myArray –  > Por bgusach.
  • Cu toate răspunsurile următoare și având un răspuns acceptat, nimeni nu explică de ce apare problema și cum să o rezolvăm cu bucla for. #forEach funcționează. Dar întrebarea era despre for loop. –  > Por FreeLightman.
17 răspunsuri
Dory Zidon

Folosiți forEach este o funcție de matrice încorporată. Array.forEach():

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

Comentarii

  • @DoryZidon: forEach nu acceptă break sau stop – developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… –  > Por Ankur Loriya.
  • Rețineți că este important să aveți cu adevărat un array. Dacă aveți yourArray din ceva de genul document.getElementsByClassName acesta ar fi un HTMLCollection, nu un array. Atunci această întrebare ar putea fi de ajutor. –  > Por J0ANMM.
  • Notă: forEach este blocantă și nu acceptă await.The for...of bucla va. –  > Por PotatoFarmer.
Yuci

Câteva cazuri de utilizare a buclei prin intermediul unui tablou în modulul modul de programare funcțională în JavaScript:

1. Pur și simplu faceți o buclă printr-un array

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() nu este o modalitate funcțională stricto sensu, deoarece funcția pe care o ia ca parametru de intrare nu trebuie să returneze o valoare, care astfel nu poate fi considerată o funcție pură.

2. Verificarea dacă oricare dintre elementele unui array trece un test

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. Transformarea într-un nou array

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

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

Notă: Metoda map() creează un nou tablou cu rezultatele apelării unei funcții furnizate asupra fiecărui element din tabloul apelant.

4. Însumați o anumită proprietate și calculați media acesteia

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. Creați un nou array bazat pe cel original, dar fără a-l modifica

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. Numărați numărul fiecărei categorii

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. Recuperarea unui subansamblu al unui tablou pe baza unor criterii specifice

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

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

Notă: Metoda filter() creează un nou array cu toate elementele care trec testul implementat de funcția furnizată.

8. Sortați un array

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

9. Găsirea unui element într-un array

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

Metoda Array.prototype.find() returnează valoarea primului element din array care satisface funcția de testare furnizată.

Referințe

Comentarii

  • Aceasta este o referință fantastică – este originală pentru această întrebare sau aveți ceva asemănător găzduit în altă parte? –  > Por Salvatore.
  • Răspuns foarte bine explicat și complet, vă mulțumesc pentru contribuție. –  > Por Erica Summers.
  • bună, dacă vreau să arăt toate numele și apoi să fac comparație, știți cum se face? –  > Por dipgirl.
  • @dipgirl, este ceva de genul de mai jos? 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); –  > Por Yuci.
  • Toate cazurile de utilizare cu exemple simple! Am marcat acest lucru în browser! Primul meu bookmark de pe StackOverflow 🙂 –  > Por stayingcool.
Dwayne Charrington

Puteți utiliza un for..of loop pentru a face o buclă peste o matrice de obiecte.

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

Unul dintre cele mai bune lucruri despre for..of bucle este faptul că pot itera peste mai mult decât doar array-uri. Puteți itera peste orice tip de iterabil, inclusiv hărți și obiecte. Asigurați-vă că folosiți un transpiler sau ceva de genul TypeScript dacă trebuie să suportați browsere mai vechi.

Dacă ați dori să iterați peste o hartă, sintaxa este în mare parte aceeași ca cea de mai sus, cu excepția faptului că se gestionează atât cheia, cât și valoarea.

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

Eu folosesc for..of bucle pentru aproape orice tip de iterație pe care o fac în Javascript. În plus, unul dintre cele mai interesante lucruri este că funcționează și cu async/await.

Comentarii

  • Prefer acest lucru în async funcții decât folosind await Promise.all(array.map(async (element) => { cu o funcție separată try catch. Un cod mult mai curat. –  > Por xinthose.
Thierry
for (var j = 0; j < myArray.length; j++){
  console.log(myArray[j].x);
}

Comentarii

  • Aceasta este doar soluția pentru a doua întrebare, totuși. –  > Por Sirko.
dev mamba

Iată un exemplu despre cum poți face acest lucru 🙂

Comentarii

  • cum ai obține valoarea track pentru fiecare element și să o atribuiți unei variabile pentru a o folosi sau interpola într-o altă parte a codului? –  > Por Chris22.
MangoPapa7

IIS este util să stocheze în cache versiunea veche și îmi dă această eroare. Tocmai schimbasem, reconstruisem și reinstalasem ansamblul în GAC. O posibilă soluție este să folosiți Task Manager pentru a ucide

w3wp.exe

. Acest lucru forțează IIS să citească din nou ansamblul din GAC: problemă rezolvată.

Iadine GOUNDETE

În cazul în care această eroare cauzată de schimbarea namespace-ului, asigurați-vă că folderul acelui proiect este redenumit cu același nume, și închideți VS.NEEdităm proiectul care are problema cu Notepad și înlocuim acolo nodurilemyArray[j.x]„RootNamespace>New_Name_Of_Folder_Of_Of_Your_Project_Namespace „RootNamespace> „AssemblyName>New_Name_Of_Folder_Of_Your_Project_Namespace „AssemblyName>

(myArray[j].x);Dosarul nu contează, dar am uitat să schimb spațiul de nume implicit al proiectului după ce m-am mutat și am redenumit proiectele. Mulțumesc că m-ați îndrumat în direcția corectă. – 

cdonner

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

Comentarii

    Mauricio Scheffer

  • > Por .Version=1.0.3.0 indică Castle RC3, însă interfața fluentă a fost dezvoltată la câteva luni după lansarea RC3. Prin urmare, se pare că aveți o problemă de versiuni. Poate că aveți Castle RC3 înregistrat în GAC și îl folosește pe acela…

Interesant, am primit cea mai recentă versiune aici:

builds.castleproject.org/cruise/DownloadBuild.castle?number=956

Este ceea ce au recomandat pe forumul lor. De asemenea, dacă ar fi fost cazul, îmi imaginez că proiectul nu s-ar fi compilat deloc. Dar acesta se compilează fără probleme – 

George Mauer

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

În ceea ce privește faptul că am versiunea în GAC, probabil că am, dar nu am adăugat referința din GAC, iar utilizarea reflectorului pe referință indică faptul că este cea pe care am crezut-o – 

George Mauer

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

Încearcă să elimini ansamblul duplicat din GAC, sunt dispus să fiu că asta este problema ta. – 

Eric Schoonover

SteveC

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

Primesc acest lucru ocazional și întotdeauna a fost în jos pentru a avea ansamblul în GAC

Shelby115

$.each(array, function(element) {
  // do some operations with each element... 
});
Ștergerea fișierului meu .pdb pentru dll a rezolvat această problemă pentru mine. Presupun că are legătură cu faptul că dll-ul a fost creat folosind ILMerge.

Comentarii

  • Asta a fost tot pentru mine! Nu știu ce este ILMerge, dar lui Epicor nu i-a plăcut să aibă fișierul pdb lângă ansamblul meu. – $.eachMDave > Por .Nu ILMerge, dar ștergerea tuturor fișierelor PDB a rezolvat problema. – 
  • hogarth45

Jakub Szumiato

$.each(array, function(index, item) {
       console.log(index, item);
});
Când mă confrunt cu o astfel de problemă, consider că instrumentul FUSLOGVW este foarte util. Acesta verifică informațiile legate de asamblare și le înregistrează pentru dvs. Uneori bibliotecile lipsesc, alteori GAC are versiuni diferite care sunt încărcate. Uneori, platforma bibliotecilor referite cauzează probleme. Acest instrument clarifică modul în care sunt rezolvate legăturile dependențelor, ceea ce vă poate ajuta foarte mult în investigarea/depanarea problemei dumneavoastră.

Fusion Log Viewer / fuslogvw / Vizualizator de jurnal de legături de asamblare. Consultați mai multe/descărcați aici:

http://msdn.microsoft.com/en-us/library/e74a18c4.aspx

.

Există o modalitate de a face ca FUSLOGVW să funcționeze cu Visual Studio Designer? Visual Studio Designer aruncă o excepție atunci când încerc să editez unul dintre dialogurile mele („Method not found”), pentru o metodă despre care știu că există (aplicația rulează bine). Din câte văd, nu apare nimic în FUSLOGVW atunci când editați ceva în Visual Studio Designer. – 

Jimmy

CJSewell

  yourArray.forEach(arrayItem => {
      var x = arrayItem.prop1 + 2;
      console.log(x);
  });
Am avut această problemă după ce am factorizat un nume de clasă:

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

Oprirea IIS și ștergerea conținutului în

a rezolvat-o pentru mine.
În funcție de proiectul dvs. (32/64bit, versiunea .net, etc.), se poate utiliza corect

diferă:

64 Bit

32 Bit

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

while (arr[c].name) { c++; } // TypeError: Cannot read property 'name' of undefined
Pe mașina mea de dezvoltare a fost (poate pentru că are IIS Express?)

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

ReflexiveCode

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

Poate că nu este la fel de probabil, dar pentru mine a fost cauzat de faptul că aplicația mea a încercat să încarce o bibliotecă cu același nume de asamblare (xxx.exe încărcând xxx.dll).

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

jk.

Tocmai am dat peste asta cu o altă cauză:

rularea testelor unitare în modul de lansare, dar biblioteca care se încărca era versiunea din modul de depanare care nu fusese actualizată

smirkingman

// array snippet (returned from here)
} else {
   callback([results])
}

Încă o soluție: DLL-uri vechi care se îndreaptă una spre cealaltă și stocate în memoria cache de Visual Studio în

for(const result of results){
   console.log(result.x)
}

Ieșiți din VS, ștergeți tot ce se află în acest folder și Bob este unchiul vostru.

gaurav

for (element in array) {
    console.log(array[element].property);
  }

Am avut aceeași problemă. Tocmai am rezolvat-o prin actualizarea ansamblului prin GAC.

Pentru a utiliza gacutil pe o mașină de dezvoltare mergeți la: