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!
Folosiți forEach este o funcție de matrice încorporată. Array.forEach()
:
yourArray.forEach(function (arrayItem) {
var x = arrayItem.prop1 + 2;
console.log(x);
});
- @DoryZidon: forEach nu acceptă break sau stop – developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… – > .
- Rețineți că este important să aveți cu adevărat un array. Dacă aveți
yourArray
din ceva de genuldocument.getElementsByClassName
acesta ar fi un HTMLCollection, nu un array. Atunci această întrebare ar putea fi de ajutor. – > . - Notă:
forEach
este blocantă și nu acceptăawait
.Thefor...of
bucla va. – > .
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
- Aceasta este o referință fantastică – este originală pentru această întrebare sau aveți ceva asemănător găzduit în altă parte? – > .
- Răspuns foarte bine explicat și complet, vă mulțumesc pentru contribuție. – > .
- bună, dacă vreau să arăt toate numele și apoi să fac comparație, știți cum se face? – > .
- @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);
– > . - Toate cazurile de utilizare cu exemple simple! Am marcat acest lucru în browser! Primul meu bookmark de pe StackOverflow 🙂 – > .
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.
- Prefer acest lucru în
async
funcții decât folosindawait Promise.all(array.map(async (element) => {
cu o funcție separatătry catch
. Un cod mult mai curat. – > .
for (var j = 0; j < myArray.length; j++){
console.log(myArray[j].x);
}
- Aceasta este doar soluția pentru a doua întrebare, totuși. – > .
Iată un exemplu despre cum poți face acest lucru 🙂
- 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? – > .
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ă.
Î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);
}
- Mauricio Scheffer
- > .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:
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. –
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
$.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.
- 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
> .Nu ILMerge, dar ștergerea tuturor fișierelor PDB a rezolvat problema. –
hogarth45
$.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:
.
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
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
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.
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:
j
este un număr. L-ați definit în partea de sus a buclei. – user1106925myArray
nu este de fapt doar o matrice, până la urmă?? – > Por techfoobar.#forEach
funcționează. Dar întrebarea era despre for loop. – > Por FreeLightman.