var obj = {
name: "Simon",
age: "20",
clothing: {
style: "simple",
hipster: false
}
}
for(var propt in obj){
console.log(propt + ': ' + obj[propt]);
}
Cum variabila propt
reprezintă proprietățile obiectului? L's nu este o metoda built-in sau de proprietate. De ce vin cu fiecare proprietate în obiect?
Iterarea peste proprietăți necesită suplimentare hasOwnProperty
verifica:
for (var prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
// do stuff
}
}
L's necesare pentru ca un obiect's prototip conține proprietăți suplimentare pentru obiectul care sunt punct de vedere tehnic o parte din obiect. Aceste proprietăți suplimentare sunt moștenite de la baza obiectului de clasă, dar sunt încă proprietăți de ob
.
hasOwnProperty
pur și simplu verifică pentru a vedea dacă aceasta este o proprietate specifică pentru această clasă, și nu unul moștenite din clasa de bază.
L's, de asemenea, posibil pentru a apela `hasOwnProperty prin obiectul în sine:
if (obj.hasOwnProperty(prop)) {
// do stuff
}
Dar acest lucru va eșua în cazul în care obiect are o legătură câmpul cu același nume:
var obj = { foo: 42, hasOwnProperty: 'lol' };
obj.hasOwnProperty('foo'); // TypeError: hasOwnProperty is not a function
Ca's de ce-l'e mai sigur să spunem prin Obiect.prototip` în loc:
var obj = { foo: 42, hasOwnProperty: 'lol' };
Object.prototype.hasOwnProperty.call(obj, 'foo'); // true
Ca de JavaScript 1.8.5 puteți folosi Obiect.cheile(obj)pentru a obține o Serie de proprietăți definite pe obiect în sine (cele care returnează true pentru obj.hasOwnProperty(cheie)
).
Object.keys(obj).forEach(function(key,index) {
// key: the name of the object key
// index: the ordinal position of the key within the object
});
Acest lucru este mai bună (și mai ușor de citit) decât folosind-o pentru-în buclă.
Sale sprijinite pe aceste browsere:
A se vedea Mozilla Developer Network Obiect.tastele()'s reference pentru informații suplimentare.
Fete si baieti, suntem în 2019 și nu avem atât de mult timp pentru tastarea... Deci, haideți să facem această nouă fantezie ECMAScript 2016:
Object.keys(obj).forEach(e => console.log(`key=${e} value=${obj[e]}`));
În up-to-data de implementări de ES, puteți utiliza Obiect.intrări
:
for (const [key, value] of Object.entries(obj)) { }
sau
Object.entries(obj).forEach(([key, value]) => ...)
Dacă doriți doar pentru a itera peste valorile, apoi utilizați Obiect.valori:
for (const value of Object.values(obj)) { }
sau
Object.values(obj).forEach(value => ...)
Dacă mediul dvs. acceptă ES2017 atunci aș recomanda Obiect.intrări:
Object.entries(obj).forEach(([key, value]) => {
console.log(`${key} ${value}`);
});
Așa cum se arată în Mozillas Obiect.intrări() documentație:
Obiect.intrări() metoda returneaza un array de un obiect dat's propriu enumerable proprietate [cheie, valoare] perechi, în aceeași ordine în care furnizate de un pentru...în buclă (diferența fiind că un pentru-în buclă enumeră proprietăți în lanț prototip la fel de bine).
Practic, cu Obiect.intrări putem renunța la următorul pas suplimentar care este necesar, cu vârstă în bucla:
// This step is not necessary with Object.entries
if (object.hasOwnProperty(property)) {
// do stuff
}
Raspunsurile de mai sus sunt un pic enervant, deoarece acestea nu't explica ceea ce faci în buclă după ce asigura it's un obiect: NU'T ACCES DIRECT! Sunt de fapt numai livrate CHEIA care ai nevoie pentru a aplica la OBJ:
var obj = {
a: "foo",
b: "bar",
c: "foobar"
};
// We need to iterate the string keys (not the objects)
for(var someKey in obj)
{
// We check if this key exists in the obj
if (obj.hasOwnProperty(someKey))
{
// someKey is only the KEY (string)! Use it to get the obj:
var myActualPropFromObj = obj[someKey]; // Since dynamic, use [] since the key isn't literally named "someKey"
// NOW you can treat it like an obj
var shouldBeBar = myActualPropFromObj.b;
}
}
Acest lucru este tot ECMA5 în condiții de siguranță. Funcționează chiar și în lame JS versiuni cum ar fi Rinocer ;)
Pentru a adăuga ES2015's utilizare de a Reflecta.ownKeys(obj) și, de asemenea, iterarea peste proprietăți prin intermediul unui iterator.
De exemplu:
let obj = { a: 'Carrot', b: 'Potato', Car: { doors: 4 } };
poate fi reiterat de
// logs each key
Reflect.ownKeys(obj).forEach(key => console.log(key));
Dacă doriți pentru a repeta direct peste valorile cheilor de un obiect, puteți defini un iterator`, doar ca JavaScipts's, default iteratori pentru siruri de caractere, tablouri, introduce tablouri, Hartă și Set.
JS va încercarea de a repeta prin intermediul default iterator de proprietate, care trebuie să fie definită ca Simbol.iterator
.
Dacă doriți să fie în măsură să itera peste toate obiectele puteți să-l adăugați ca un prototip al Obiectului:
Object.prototype[Symbol.iterator] = function*() {
for(p of Reflect.ownKeys(this)){ yield this[p]; }
}
Acest lucru ar permite să itera peste valorile unui obiect cu o...de buclă, de exemplu:
for(val of obj) { console.log('Value is:' + val ) }
Atenție: Ca a scris acest răspuns (iunie 2018) toate celelalte browsere, dar, de EXEMPLU, generatoarele de suport și pentru...deiterare prin Simbolul lui.iterator
Pentru...în buclă reprezintă fiecare proprietate dintr-un obiect, pentru că este ca o buclă. Ai definit propt în...în bucla de a face:
for(var propt in obj){
alert(propt + ': ' + obj[propt]);
}
O pentru...în buclă reiterează prin nenumărate proprietăți ale unui obiect. Oricare variabilă definiți, sau pus în...în buclă, se schimbă de fiecare dată când merge la următoarea proprietate se reiterează. Variabila pentru...în buclă reiterează prin cheile, dar valoarea este cheia's valoare. De exemplu:
for(var propt in obj) {
console.log(propt);//logs name
console.log(obj[propt]);//logs "Simon"
}
Puteți vedea cum variabile diferă în funcție de variabila's valoare. În schimb, pentru o...de buclă nu invers.
Sper că acest lucru ajută.
Puteți utiliza Lodash. Documentația
var obj = {a: 1, b: 2, c: 3};
_.keys(obj).forEach(function (key) {
...
});
În zilele noastre, puteți converti un standard JS obiect într-un iterable obiect doar prin adăugarea unui Simbol.metoda iterator. Apoi, puteți utiliza pentru a` bucla și acceess valorile sale în mod direct sau chiar se poate folosi o răspândire operator pe obiect prea. Rece. Las's vedem cum putem face asta:
var o = {a:1,b:2,c:3},
a = [];
o[Symbol.iterator] = function*(){
var ok = Object.keys(this);
i = 0;
while (i < ok.length) yield this[ok[i++]];
};
for (var value of o) console.log(value);
// or you can even do like
a = [...o];
console.log(a);
Tipuri de mod de a repeta obiect în javascript
în buclă
pentru...de buclă
forEach() metoda
harta() metoda
let obj = {
city1: 'BOM',
city2: 'BLR',
city3: 'HYD',
state: {
city1: 'Sub-city1',
city2: 'Sub-city2'
}
}
console.log('----------------using for...in loop------')
for(let entry in obj)
console.log(entry +" -> "+ obj[entry])
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key + " -> " + obj[key]);
}
}
console.log('----------------using for...of loop------')
for (const key of Object.keys(obj))
console.log(key +" -> "+ obj[key]);
for (const [key, value] of Object.entries(obj))
console.log(key +" -> "+ value);
console.log('----------------using forEach loop------')
Object.entries(obj).forEach(([key, value]) => console.log(key +" -> "+ value));
console.log('----------------using map function------')
Object.entries(obj).map(([k,v])=> console.log(k+' -> '+v))
Modul de a repeta obiecte imbricate
let obj = {
city1: 'ALD',
city2: 'BLR',
city3: 'HYD',
state: {
city4: 'Sub-city1',
city5: 'Sub-city2'
}
}
function nestedObj(obj) {
for (let key in obj) {
// checking if it's nested to iterate again
if (obj.hasOwnProperty(key) &&
(typeof obj[key] === "object")) {
nestedObj(obj[key])
} else {
// showing the flat attributes
console.log(key + " -> " + obj[key]);
}
}
}
nestedObj(obj);
În timp ce top-evaluat răspunsul este corect, aici este o alternativă în caz de utilizare am.dacă sunteți iterarea peste un obiect și doriți să creați o matrice în cele din urmă. Utilizarea .harta
în loc de "forEach"
const newObj = Object.keys(obj).map(el => {
//ell will hold keys
// Getting the value of the keys should be as simple as obj[el]
})