che uso ha il metodo javascript forEach (che la mappa non può fare)?



Answers

La principale differenza tra i due metodi è concettuale e stilistica: tu usi forEach quando vuoi fare qualcosa con o con ogni elemento di un array (facendo "with" è ciò che il post che citi intendeva per "effetti collaterali", penso ), mentre usi la map quando vuoi copiare e trasformare ogni elemento di un array (senza cambiare l'originale).

Poiché sia ​​la map che forEach chiamano una funzione su ogni elemento in una matrice e tale funzione è definita dall'utente, non c'è quasi nulla che tu possa fare con una e non con l'altra. È possibile, anche se brutto, utilizzare la map per modificare un array sul posto e / o fare qualcosa con gli elementi dell'array:

var a = [{ val: 1 }, { val: 2 }, { val: 3 }];
a.map(function(el) {
    el.val++; // modify element in-place
    alert(el.val); // do something with each element
});
// a now contains [{ val: 2 }, { val: 3 }, { val: 4 }]

ma molto più pulito e più ovvio per quanto riguarda il tuo intento di utilizzare per forEach :

var a = [{ val: 1 }, { val: 2 }, { val: 3 }];
a.forEach(function(el) { 
    el.val++;
    alert(el.val);
});

Soprattutto se, come di solito accade nel mondo reale, el è una variabile utilmente leggibile dall'uomo:

cats.forEach(function(cat) { 
    cat.meow(); // nicer than cats[x].meow()
});

Allo stesso modo, puoi facilmente usare forEach per creare un nuovo array:

var a = [1,2,3],
    b = [];
a.forEach(function(el) { 
    b.push(el+1); 
});
// b is now [2,3,4], a is unchanged

ma è più pulito usare la map :

var a = [1,2,3],
    b = a.map(function(el) { 
        return el+1; 
    });

Nota anche che, poiché la map crea un nuovo array, probabilmente incorre almeno in alcune prestazioni / problemi di memoria quando tutto ciò che serve è l'iterazione, in particolare per i grandi array - vedi http://jsperf.com/map-foreach

Per quanto riguarda il motivo per cui si desidera utilizzare queste funzioni, sono utili ogni volta che è necessario manipolare l'array in javascript, che (anche se si tratta solo di javascript in un ambiente browser) è abbastanza spesso, quasi in qualsiasi momento stai accedendo a un array che non stai scrivendo a mano nel tuo codice. Potresti avere a che fare con una serie di elementi DOM sulla pagina, o dati estratti da una richiesta AJAX, o dati inseriti in un modulo dall'utente. Un esempio comune a cui mi imbatto è quello di estrarre dati da un'API esterna, dove potresti voler utilizzare la map per trasformare i dati nel formato che desideri e quindi usare forEach per iterare sul nuovo array per visualizzarlo all'utente.

Question

L'unica differenza che vedo nella mappa e nel foreach è che la map sta restituendo un array e forEach non lo è. Tuttavia, non capisco nemmeno l'ultima riga del metodo func.call(scope, this[i], i, this); " func.call(scope, this[i], i, this); ". Ad esempio, non è " this " e " scope " che si riferiscono allo stesso oggetto e non è this[i] e i riferisco al valore corrente nel ciclo?

Ho notato su un altro post qualcuno ha detto "Usa forEach quando vuoi fare qualcosa sulla base di ciascun elemento della lista, ad esempio potresti aggiungere cose alla pagina. Essenzialmente, è ottimo per quando vuoi" effetti collaterali " . Non so cosa si intende per effetti collaterali.

Array.prototype.map = function(fnc) {
    var a = new Array(this.length);
    for (var i = 0; i < this.length; i++) {
        a[i] = fnc(this[i]);
    }
    return a;
}

Array.prototype.forEach = function(func, scope) { 
    scope = scope || this; 
    for (var i = 0, l = this.length; i < l; i++) {
        func.call(scope, this[i], i, this); 
    } 
}

Infine, ci sono degli usi reali per questi metodi in javascript (dato che non stiamo aggiornando un database) se non per manipolare numeri come questo:

alert([1,2,3,4].map(function(x){ return x + 1})); //this is the only example I ever see of map in javascript.

Grazie per qualsiasi risposta.




TL; risposta DR -

map restituisce sempre un altro array.

forEach no. Spetta a te decidere cosa fa. Restituisci un array se vuoi o fai qualcos'altro se non lo fai.

La flessibilità è auspicabile in determinate situazioni. Se non è per quello che hai a che fare allora usa la mappa.




Mentre tutte le domande precedenti sono corrette, farei sicuramente una distinzione diversa. L'uso di map e forEach può implicare l'intento.

Mi piace usare la map quando sto semplicemente trasformando i dati esistenti in qualche modo (ma voglio essere sicuro che i dati originali siano rimasti invariati.

Mi piace usare forEach quando sto modificando la raccolta sul posto.

Per esempio,

var b = [{ val: 1 }, { val: 2 }, { val: 3 }];
var c = b.map(function(el) {
    return { val: el.val + 1 }; // modify element in-place
});
console.log(b);
//  [{ val: 1 }, { val: 2 }, { val: 3 }]
console.log(c);
//  [{ val: 3 }, { val: 4 }, { val: 5 }]

La mia regola empirica è quella di accertarmi che quando esegui la map crei sempre un nuovo oggetto / valore da restituire per ciascun elemento della lista di origine e lo restituisca piuttosto che eseguire solo un'operazione su ciascun elemento.

A meno che non si abbia realmente bisogno di modificare l'elenco esistente, non ha senso modificarlo e adattarsi meglio agli stili di programmazione funzionali / immutabili.




Questa è una bellissima domanda con una risposta inaspettata.

Quanto segue si basa sulla descrizione ufficiale di Array.prototype.map() .

Non c'è nulla che forEach() possa fare che map() non possa. Vale a dire, map() è un super-set forEach() di forEach() .

Sebbene map() solito sia usato per creare un nuovo array, può anche essere usato per cambiare l'array corrente. Il seguente esempio illustra questo:

var a = [0, 1, 2, 3, 4], mapped = null;
mapped = a.map(function (x) { a[x] = x*x*x; return x*x; });
console.log(mapped); // logs [0, 1, 4, 9, 16]  As expected, these are squares.
console.log(a); // logs [0, 1, 8, 27, 64] These are cubes of the original array!!

Nell'esempio sopra, a stato opportunamente impostato in modo tale che a[i] === i per i < a.length . Anche così, dimostra la potenza di map() , e in particolare la sua capacità di cambiare la matrice su cui è chiamato.

Nota 1:
La descrizione ufficiale implica che map() possa anche cambiare la lunghezza dell'array su cui è chiamato! Tuttavia, non riesco a vedere (un buon) motivo per farlo.

Nota 2:
Mentre map() map è un super-set di forEach() , forEach() dovrebbe comunque essere usato dove si desidera modificare un array dato. Questo rende chiare le tue intenzioni.

Spero che questo abbia aiutato.




Related