Posted by Sean on Friday, 20th June 2014 18:01
In programmazione capita spessissimo di dover iterare una lista di elementi.
In JavaScript, questo è abbastanza semplice per degli
abc = ['a', 'b', 'c']
for (var i = 0; i < abc.length; i++) {
console.log(abc[i]);
}
A questo esempio si potrebbe fare solo una piccola obiezione: la misura della lista
In molti casi, questo non fa differenza, ma se la lista è grande può diventare una rallentamento apprezzabile.
È una buona abitudine, quindi, evitare questo inconveniente - cosa peraltro molto semplice da fare.
Basta infatti memorizzare la lunghezza della lista prima di cominciare il loop, così:
abc = ['a', 'b', 'c']
var l = abc.length;
for (var i = 0; i < l; i++) {
console.log(abc[i]);
}
Un metodo ancora un po' più 'pulito' sarebbe di utilizzare il metodo nativo
abc = ['a', 'b', 'c']
abc.forEach(function(valore, indice, array) {
console.log(valore);
});
Lo svantaggio di questo metodo è che si tratta di una versione relativamente giovane di JavaScript (ECMAScript 5), e quindi non supportata da alcuni browser (come IE < 9).
Bisognerà compensare questa mancanza - vedi https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Polyfill.
E fin qui tutto bene. Ma... se volessi iterare una lista associativa? Nota: JavaScript non esistono array associativi, ma si possono usare oggetti normali in modo simile.
Potrebbe sembrare evidente - basta usare un loop
var o = {
'uno': 'I',
'due': 'II',
'tre': 'III',
'quattro': 'IV',
'cinque': 'V'
};
for (k in o) {
console.log(k, " = ", o[k]);
}
E invece commettereste un grave errore. Il loop
Dobbiamo quindi assicurarci che le proprietà passate dal loop non provengano dal
var o = {
'uno': 'I',
'due': 'II',
'tre': 'III',
'quattro': 'IV',
'cinque': 'V'
};
for (k in o) {
if (o.hasOwnProperty(k)) {
console.log(k, " = ", o[k]);
}
}
In JavaScript, questo è abbastanza semplice per degli
Array
(che in JavaScript hanno solo indici numerici) - basta usare un loop for
'classico':abc = ['a', 'b', 'c']
for (var i = 0; i < abc.length; i++) {
console.log(abc[i]);
}
A questo esempio si potrebbe fare solo una piccola obiezione: la misura della lista
abc
è ricalcolata a ciascuna iterazione. In molti casi, questo non fa differenza, ma se la lista è grande può diventare una rallentamento apprezzabile.
È una buona abitudine, quindi, evitare questo inconveniente - cosa peraltro molto semplice da fare.
Basta infatti memorizzare la lunghezza della lista prima di cominciare il loop, così:
abc = ['a', 'b', 'c']
var l = abc.length;
for (var i = 0; i < l; i++) {
console.log(abc[i]);
}
Un metodo ancora un po' più 'pulito' sarebbe di utilizzare il metodo nativo
forEach()
degli Array
in JavaScript:abc = ['a', 'b', 'c']
abc.forEach(function(valore, indice, array) {
console.log(valore);
});
Lo svantaggio di questo metodo è che si tratta di una versione relativamente giovane di JavaScript (ECMAScript 5), e quindi non supportata da alcuni browser (come IE < 9).
Bisognerà compensare questa mancanza - vedi https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Polyfill.
E fin qui tutto bene. Ma... se volessi iterare una lista associativa? Nota: JavaScript non esistono array associativi, ma si possono usare oggetti normali in modo simile.
Potrebbe sembrare evidente - basta usare un loop
for...in
, no?var o = {
'uno': 'I',
'due': 'II',
'tre': 'III',
'quattro': 'IV',
'cinque': 'V'
};
for (k in o) {
console.log(k, " = ", o[k]);
}
E invece commettereste un grave errore. Il loop
for...in
, infatti, non itera soltanto le proprietà di un particolare oggetto, ma tutte le sue proprietà enumerabili - quindi anche quelle ereditate dal prototype
.Dobbiamo quindi assicurarci che le proprietà passate dal loop non provengano dal
prototype
. A questo scopo usiamo il metodo hasOwnProperty
:var o = {
'uno': 'I',
'due': 'II',
'tre': 'III',
'quattro': 'IV',
'cinque': 'V'
};
for (k in o) {
if (o.hasOwnProperty(k)) {
console.log(k, " = ", o[k]);
}
}