jQuery map contro ciascuno


Risposte:


268

Il eachmetodo è pensato per essere un iteratore immutabile, dove come mapmetodo può essere usato come iteratore, ma è davvero pensato per manipolare l'array fornito e restituire un nuovo array.

Un'altra cosa importante da notare è che la eachfunzione restituisce l'array originale mentre la mapfunzione restituisce un nuovo array. Se si utilizza in modo eccessivo il valore restituito della funzione mappa, è possibile che si sprechi molta memoria.

Per esempio:

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]

È inoltre possibile utilizzare la funzione mappa per rimuovere un elemento da un array. Per esempio:

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]

Noterai anche che thisnon è mappato nella mapfunzione. Dovrai fornire il primo parametro nel callback (ad es. Abbiamo usato isopra). Ironia della sorte, gli argomenti di callback utilizzati in ciascun metodo sono il contrario degli argomenti di callback nella funzione map, quindi fai attenzione.

map(arr, function(elem, index) {});
// versus 
each(arr, function(index, elem) {});

22
Sbagliato, la mappa non ha lo scopo di modificare l'array fornito, ma deve restituire un nuovo array basato sull'array di input e sulla funzione di mapping.
arul

4
@Seb, leggi il mio link a ciascuna funzione, il secondo paragrafo la funzione jQuery.each non è la stessa di $ (). Each ().
Bendewey,

4
Anche map () appiattisce gli array restituiti
George Mauer,

3
Perché usare $ .each a tutti?
Dave Van den Eynde,

6
@DaveVandenEynde se vuoi rompere nel mezzo del ciclo usandoreturn false;
Vigneshwaran,

93

1: gli argomenti delle funzioni di callback sono invertiti.

.each()La funzione di callback di 's, $.each()' e .map()s prende prima l'indice e poi l'elemento

function (index, element) 

$.map()Il callback ha gli stessi argomenti, ma invertito

function (element, index)

2: .each(), $.each(), e .map()fare qualcosa di speciale conthis

each()chiama la funzione in modo tale che thispunti all'elemento corrente. Nella maggior parte dei casi, non sono nemmeno necessari i due argomenti nella funzione di callback.

function shout() { alert(this + '!') }

result = $.each(['lions', 'tigers', 'bears'], shout)

// result == ['lions', 'tigers', 'bears']

Per $.map()la thisvariabile si riferisce all'oggetto finestra globale.

3: map()fa qualcosa di speciale con il valore di ritorno del callback

map()chiama la funzione su ciascun elemento e memorizza il risultato in un nuovo array, che restituisce. Di solito è necessario utilizzare solo il primo argomento nella funzione di callback.

function shout(el) { return el + '!' }

result = $.map(['lions', 'tigers', 'bears'], shout)

// result == ['lions!', 'tigers!', 'bears!']

function shout() { alert(this + '!') } result = $.each(['lions', 'tigers', 'bears'], shout)producendo un risultato sbagliato contraddice la tua risposta !! jsfiddle.net/9zy2pLev
Hemant

@Hemant Ho appena provato il violino in Chrome e sembra funzionare bene. Ci sono tre dialoghi di allerta ("leoni!", "Tigri!", "Orsi!") E alla fineresult === ['lions', 'tigers', 'bears']
Patrick McElhaney,

22

La eachfunzione scorre su un array, chiamando la funzione fornita una volta per elemento e impostandola thissull'elemento attivo. Questo:

function countdown() {
    alert(this + "..");
}

$([5, 4, 3, 2, 1]).each(countdown);

avviserà 5..quindi 4..poi 3..poi 2..poi1..

La mappa invece prende un array e restituisce un nuovo array con ogni elemento modificato dalla funzione. Questo:

function squared() {
    return this * this;
}

var s = $([5, 4, 3, 2, 1]).map(squared);

si tradurrebbe in essere [25, 16, 9, 4, 1].


18

l'ho capito da questo :

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] 

così, " ogni " funzione restituisce l'array originale mentre la funzione " map " restituisce un nuovo array


0
var intArray = [1, 2, 3, 4, 5];
//lets use each function
$.each(intArray, function(index, element) {
  if (element === 3) {
    return false;
  }
  console.log(element); // prints only 1,2. Breaks the loop as soon as it encountered number 3
});

//lets use map function
$.map(intArray, function(element, index) {
  if (element === 3) {
    return false;
  }
  console.log(element); // prints only 1,2,4,5. skip the number 3.
});

-1

Jquery.map ha più senso quando si lavora su array in quanto funziona molto bene con gli array.

Jquery.each è meglio usato quando si scorre tra gli elementi del selettore. Ciò è evidenziato dal fatto che la funzione mappa non utilizza un selettore.

$(selector).each(...)

$.map(arr....)

come puoi vedere, la mappa non è pensata per essere utilizzata con i selettori.


2
sfortunatamente il nome di ogni funzione ... Non la prima volta, e non l'ultima che mi inciamperà su quale qualcuno sta chiedendo
Jeremy B.

8
entrambi hanno una versione selector e una versione util. $ .map e $ .each contro $ (""). map e $ (""). ciascuno.
Magnar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.