Nu wil ik alles doorlopen p elementen (p1,p2,p3...) en hun sleutels en waarden krijgen. Hoe kan ik dat doen?
Ik kan het JavaScript-object indien nodig aanpassen. Mijn ultieme doel is om door enkele belangrijke waardeparen te lopen en indien mogelijk wil ik vermijden om te gebruiken eval.
U kunt de for-in loop zoals getoond door anderen. U moet er echter ook voor zorgen dat de sleutel die u krijgt een werkelijke eigenschap van een object is en niet afkomstig is van het prototype.
ES2017 voegt toe Object.entries() waarbij wordt vermeden dat elke waarde in het oorspronkelijke object moet worden opgezocht:
Beide Object.keys() en Object.entries() itereer eigenschappen in dezelfde volgorde als a for...in lus maar negeer de prototypeketen. Alleen de eigen opsombare eigenschappen van het object worden geïtereerd.
Maar wees heel voorzichtig wanneer je dit soort lus gebruikt, want dit zal loop alle eigenschappen langs de prototypeketen.
Gebruik daarom altijd bij gebruik van for-in loops altijd de hasOwnProperty methode om te bepalen of de huidige eigenschap in iteratie echt een eigenschap is van het object dat u controleert:
De vraag zal niet compleet zijn als we niets zeggen over alternatieve methoden voor het doorlussen van objecten.
Tegenwoordig bieden veel bekende JavaScript-bibliotheken hun eigen methoden voor het itereren van verzamelingen, d.w.z. over arrays, voorwerpen, en array-achtige objecten. Deze methoden zijn handig in gebruik en zijn volledig compatibel met elke browser.
Als je werkt jQuery, je mag gebruiken jQuery.each() methode. Het kan worden gebruikt om naadloos over zowel objecten als arrays te itereren:
In Underscore.js je kunt methode vinden _.each(), die itereert over een lijst met elementen, waarbij elk op zijn beurt weer een bijgeleverde functie oplevert (let op de volgorde van argumenten in iteratee functie!):
Lo-Dash biedt verschillende methoden voor het itereren van objecteigenschappen. basis- _.forEach() (of het is alias _.each()) is handig voor het doorlussen van beide objecten en arrays, maar (!) objecten met length eigenschappen worden behandeld als arrays en om dit gedrag te voorkomen, wordt aangeraden om deze te gebruiken _.forIn() en _.forOwn() methoden (deze hebben ook value argument komt als eerste):
_.forIn() itereert eigen en geërfd opsombare eigenschappen van een object, terwijl _.forOwn() itereert alleen voorbij eigen eigenschappen van een object (in feite controleren tegen hasOwnProperty functie). Voor eenvoudige objecten en objectliteralen werkt elk van deze methoden prima.
Over het algemeen hebben alle beschreven methoden hetzelfde gedrag met alle geleverde objecten. Naast het gebruik van native for..in loop zal meestal zijn sneller dan enige abstractie, zoals jQuery.each(), deze methoden zijn aanzienlijk eenvoudiger in gebruik, vereisen minder codering en bieden een betere foutafhandeling.
Mijn keuze is hieronder als een snellere oplossing in de huidige versies van browsers (Chrome30, IE10, FF25)
Aangezien es2015 steeds populairder wordt, post ik dit antwoord, inclusief het gebruik van de generator en iterator om probleemloos door te werken [key, value] paren. Zoals het mogelijk is in andere talen, bijvoorbeeld Ruby.
Alle informatie over hoe u een iterator en generator kunt maken die u kunt vinden op de ontwikkelaar Mozilla-pagina.
ES2017 zal omvatten Object.entries wat ervoor zorgt dat het itereert [key, value] paren in objecten nog eenvoudiger. Het is nu bekend dat het een onderdeel zal zijn van een standaard volgens de TS39 podium informatie.
Ik denk dat het tijd is om mijn antwoord te updaten om het nog frisser te laten worden dan het nu is.
Na het doorlopen van alle antwoorden hier, is hasOwnProperty niet vereist voor mijn eigen gebruik omdat mijn json-object schoon is; het heeft geen zin om extra JavaScript-verwerking toe te voegen. Dit is alles wat ik gebruik:
Gebruik van .Net 4.5 Async-functie voor socketprogrammering Hoe gesorteerde gegevens exporteren met mongoexport? gwt: Er is geen broncode beschikbaar voor type java.util.Calendar voeg alleen script toe aan head als dit niet bestaat c ++: Boost 1.48 type eigenschappen en Cocoa inclusie gekheid C # hoe een http web GET-verzoek correct te maken toetsenbord ios verbergen [dupliceren]