javascript - jQuery map vs. each
I jQuery ser det ut til at map og each-funksjonene gjør det samme. Er det noen praktiske forskjeller mellom de to? Når ville du valgt å bruke den ene fremfor den andre?
Svar #1
each-metoden er ment å være en uforanderlig iterator, mens map-metoden kan brukes som en iterator, men er egentlig ment å manipulere den tilførte arrayen og returnere en ny array.
En annen viktig ting å merke seg er at each-funksjonen returnerer den opprinnelige arrayen, mens map-funksjonen returnerer en ny array. Hvis du overbruker returverdien til map-funksjonen, kan du potensielt kaste bort mye minne.
For eksempel:
var items = [1,2,3,4];
$.each(items, function() {
alert('this is ' + this);
});
var newItems = $.map(items, function(i) {
return i + 1;
});
// newItems is [2,3,4,5]
Du kan også bruke map-funksjonen til å fjerne et element fra en matrise. For eksempel:
var items = [0,1,2,3,4,5,6,7,8,9];
var itemsLessThanEqualFive = $.map(items, function(i) {
// removes all items > 5
if (i > 5)
return null;
return i;
});
// itemsLessThanEqualFive = [0,1,2,3,4,5]
Du vil også legge merke til at this ikke er kartlagt i map-funksjonen. Du må selv oppgi den første parameteren i callback-en (for eksempel brukte vi i ovenfor). Ironisk nok er callback-argumentene som brukes i each-metoden motsatte av callback-argumentene i map-funksjonen, så vær forsiktig.
map(arr, function(elem, index) {});
// versus
each(arr, function(index, elem) {});
Svar #2
1: Argumentene til tilbakeringingsfunksjonene er reversert.
Tilbakeringingsfunksjonene til .each(), $.each() og .map() tar først indeksen, og deretter elementet
function (index, element)
Tilbakekallingsfunksjonen til $.map() har de samme argumentene, men i motsatt rekkefølge
function (element, index)
2: .each(), $.each(), og .map() gjør noe spesielt med this
each() kaller funksjonen på en slik måte at this peker til det nåværende elementet. I de fleste tilfeller trenger du ikke engang de to argumentene i tilbakekallingsfunksjonen.
function shout() { alert(this + '!') }
result = $.each(['lions', 'tigers', 'bears'], shout)
// result == ['lions', 'tigers', 'bears']
For $.map() refererer this-variabelen til det globale window-objektet.
3: map() gjør noe spesielt med returverdien til callback-funksjonen
map() kaller funksjonen på hvert element, og lagrer resultatet i et nytt array, som den returnerer. Du trenger vanligvis bare å bruke det første argumentet i callback-funksjonen.
function shout(el) { return el + '!' }
result = $.map(['lions', 'tigers', 'bears'], shout)
// result == ['lions!', 'tigers!', 'bears!']
Svar #3
Funksjonen each itererer over et array, kaller den leverte funksjonen én gang per element, og setter this til det aktive elementet. Dette:
function countdown() {
alert(this + "..");
}
$([5, 4, 3, 2, 1]).each(countdown);
vil varsle 5.. deretter 4.. deretter 3.. deretter 2.. deretter 1..
Map derimot tar et array, og returnerer et nytt array med hvert element endret av funksjonen. Dette:
function squared() {
return this * this;
}
var s = $([5, 4, 3, 2, 1]).map(squared);
ville resultere i at s blir [25, 16, 9, 4, 1].
Svar #4
jeg forsto det på dette:
function fun1() {
return this + 1;
}
function fun2(el) {
return el + 1;
}
var item = [5,4,3,2,1];
var newitem1 = $.each(item, fun1);
var newitem2 = $.map(item, fun2);
console.log(newitem1); // [5, 4, 3, 2, 1]
console.log(newitem2); // [6, 5, 4, 3, 2]
så, "each" funksjon returnerer det originale arrayet mens "map" funksjon returnerer et nytt array
