Карта JQuery против каждого

234

В JQuery, то mapи eachфункции , кажется, делают то же самое. Есть ли практические различия между ними? Когда вы решите использовать один вместо другого?

dthrasher
источник
См. Также: stackoverflow.com/questions/3612320/…
ryenus

Ответы:

268

Предполагается, что eachметод является неизменным итератором, а mapметод может использоваться как итератор, но на самом деле предназначен для манипулирования предоставленным массивом и возврата нового массива.

Еще одна важная вещь, которую стоит отметить, - eachфункция возвращает исходный массив, а mapфункция возвращает новый массив. Если вы чрезмерно используете возвращаемое значение функции map, вы можете потратить много памяти.

Например:

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]

Вы также можете использовать функцию карты, чтобы удалить элемент из массива. Например:

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]

Вы также заметите, что функция thisне отображается в mapфункции. Вы должны будете предоставить первый параметр в обратном вызове (например, мы использовали iвыше). По иронии судьбы, аргументы обратного вызова, используемые в каждом методе, являются обратными аргументам обратного вызова в функции map, поэтому будьте осторожны.

map(arr, function(elem, index) {});
// versus 
each(arr, function(index, elem) {});
bendewey
источник
22
Неправильно, map не предназначен для изменения предоставленного массива, он должен возвращать новый массив на основе входного массива и функции отображения.
Арул
4
@Seb, прочитайте мою ссылку на каждую функцию, второй абзац Функция jQuery.each отличается от $ (). Each ().
Bendewey
4
Также map () сглаживает возвращенные массивы
Джордж Мауэр
3
Зачем вообще использовать $ .each?
Дейв Ван ден Эйнд
6
@DaveVandenEynde, если вы хотите разорвать в середине цикла, используяreturn false;
Vigneshwaran
93

1: аргументы к функциям обратного вызова обращены.

.each()Функция обратного вызова s, $.each()s и .map()s сначала берет индекс, а затем элемент

function (index, element) 

$.map()Обратный вызов имеет те же аргументы, но обратный

function (element, index)

2: .each(), $.each()и .map()сделать что - то особенное сthis

each()вызывает функцию таким образом, что thisуказывает на текущий элемент. В большинстве случаев вам даже не нужны два аргумента в функции обратного вызова.

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

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

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

Для получения $.map()в thisпеременном относится к глобальному объекту окна.

3: map()делает что-то особенное с возвращаемым значением обратного вызова

map()вызывает функцию для каждого элемента и сохраняет результат в новом массиве, который он возвращает. Обычно вам нужно использовать только первый аргумент в функции обратного вызова.

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)неправильный результат противоречит вашему ответу !! jsfiddle.net/9zy2pLev
Hemant
@Hemant Только что протестировал скрипку в Chrome, и, похоже, она работает нормально. Есть три диалоговых окна с предупреждением («львы!», «Тигры!», «Медведи!») И в концеresult === ['lions', 'tigers', 'bears']
Патрик
22

В eachфункции перебирает массив, требующий прилагаемые функции один раза на каждый элемент, а также настройку thisк активному элементу. Это:

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

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

будет предупреждать 5..то 4..потом 3..то 2..потом1..

Map, с другой стороны, принимает массив и возвращает новый массив с каждым элементом, измененным функцией. Это:

function squared() {
    return this * this;
}

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

приведет к тому, чтобы быть [25, 16, 9, 4, 1].

Magnar
источник
18

я понял это по этому :

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] 

Итак, функция « каждая » возвращает исходный массив, а функция « Карта » возвращает новый массив

Шон
источник
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 имеет больше смысла, когда вы работаете с массивами, поскольку он очень хорошо работает с массивами.

Jquery.each лучше всего использовать при переборе элементов селектора. Что подтверждается тем, что функция карты не использует селектор.

$(selector).each(...)

$.map(arr....)

Как видите, карта не предназначена для использования с селекторами.

Джереми Б.
источник
2
к сожалению, назвали каждую функцию ... Не в первый раз и не в последний раз я получу сообщение о том, о чем кто-то спрашивает
Джереми Б.
8
Карта и каждая из них имеют версию-селектор и версию-утилиту. $ .map и $ .each vs $ (""). map и $ (""). каждый.
Магнар