Ок, это больше вопрос по информатике, чем вопрос на основе конкретного языка, но есть разница между операцией по карте и операции по каждому элементу? Или они просто разные названия одного и того же?
Разные.
цикл foreach перебирает список и применяет некоторые операции с побочными эффектами для каждого члена списка (например, сохранение каждого из них в базе например)
карта перебирает список, превращает каждого члена этого списка, и возвращает другой список того же размера с преобразованными членов (таких как преобразование списка строк в верхний регистр)
Важное различие между ними заключается в том, что "карта" аккумулирует в себе все результаты на сбор, а объекту
ничего не возвращает. "карта" обычно используется, когда вы хотите преобразовать набор элементов с функцией, в то время как объекту
просто выполняет действие для каждого элемента.
Короче говоря, объекту
для применения операции к каждому элементу коллекции элементов, в то время как карта
для преобразования одной коллекции в другую.
Есть два существенных различия между объекту
и карта
.
объекту
нет концептуальных ограничений на работу он относится, другие, чем, возможно, принять элемент в качестве аргумента. То есть, операция может ничего не делать, может иметь побочный эффект, может возвращать или не возвращать значение. Все объекту
заботится о том, чтобы выполнить итерации по коллекции элементов, и применить операцию к каждому элементу."карта", с другой стороны, имеет ограничения на работу: что ожидает операции по возвращению элемент, и, вероятно, также принимаем элемент в качестве аргумента. В "карте" операция выполняет итерацию по коллекции элементов, применяя операцию к каждому элементу, и, наконец, хранение в результате каждого вызова операции в другую коллекцию. Иными словами, "карта" transforms одной коллекции в другую.
"карта" работает с две коллекции элементы: коллекция входным и выходным коллекции.
Это не ошибка, чтобы связать два алгоритма: в самом деле, вы можете просмотреть два иерархически, где карте
специализация объекту
. То есть, вы могли бы использовать объекту
и есть операция преобразования аргумента и вставить его в другой коллекции. Итак, алгоритм по каждому элементу - это абстракция, обобщение, в алгоритм карте. На самом деле, потому что по каждому элементу
не имеет ограничений по его эксплуатации можно смело сказать, что объекту
это самый простой петлевой механизм, и он может сделать что-нибудь в цикле можно сделать. "карта", а также другие, более специализированные алгоритмы, есть ли для выразительности: если вы хотите карту (или преобразования) одной коллекции в другую, ваши намерения яснее, если вы используете "карта", чем если вы используете объекту
.
Мы можем расширить эту дискуссию и рассмотреть "копировать" алгоритм: цикл, который клонирует коллекции. Этот алгоритм тоже является специализацией алгоритм объекту
. Вы можете определить операции, что, учитывая элемент, вставить тот же элемент в другой коллекции. Если вы используете объекту
с, что работы вы по сути выполнили команду "копировать" алгоритм, хотя и с уменьшенной четкостью, выразительностью и конкретностью. Позвольте's сделать это еще дальше: можно сказать, что "карта", специализация "копировать", а сама специализация объекту
. карте
может change любого из элементов его перебирает. Если "карта" не't изменить любой из элементов, то это просто copied элементы, и, используя copy бы выразить более четко намерениях.
Сам алгоритм по каждому элементу может или не может иметь возвращаемое значение, в зависимости от языка. В C++, например, объекту
возвращает работу, она изначально получила. Идея заключается в том, что операция может иметь государство, а вы можете эту операцию снова, чтобы посмотреть, как он эволюционировал за элементы. "карта" тоже, может или не может возвращать значение. В C++ преобразования
(эквивалент для "карта" здесь), случается, возвращают итератор на конец контейнера выпуск (сборник). В Ruby, возвращаемое значение карта
выходной последовательности (коллекция). Таким образом, возвращаемое значение алгоритмов на самом деле деталь реализации, их эффект может или не может быть то, что они возвращаются.
Массива.protototype.метод map
& `массива.protototype.по каждому элементу-оба очень похожи.Выполните следующий код: http://labs.codecademy.com/bw1/6#:workspace
var arr = [1, 2, 3, 4, 5];
arr.map(function(val, ind, arr){
console.log("arr[" + ind + "]: " + Math.pow(val,2));
});
console.log();
arr.forEach(function(val, ind, arr){
console.log("arr[" + ind + "]: " + Math.pow(val,2));
});
Они дают точный результат Дитто.
arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25
arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25
Здесь я'вэ просто присваиваем результат возвращаемое значение из карты и методы по каждому элементу.
var arr = [1, 2, 3, 4, 5];
var ar1 = arr.map(function(val, ind, arr){
console.log("arr[" + ind + "]: " + Math.pow(val,2));
return val;
});
console.log();
console.log(ar1);
console.log();
var ar2 = arr.forEach(function(val, ind, arr){
console.log("arr[" + ind + "]: " + Math.pow(val,2));
return val;
});
console.log();
console.log(ar2);
console.log();
Теперь получается что-то сложно!
arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25
[ 1, 2, 3, 4, 5 ]
arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25
undefined
Массива.прототип.возвращает карту
массив массив.прототип.по каждому элементу
не'т. Так что вы можете манипулировать возвращенный массив внутри функции обратного вызова, переданной методу карте, а затем вернуть его.
`Массива.прототип.по каждому элементу идет только через данный массив, так что вы можете сделать ваши вещи во время прогулки массива.
наиболее 'видимый' разница в том, что карта накапливает результат в новой коллекции, в то время как foreach-это сделано только для самого исполнения.
но есть несколько дополнительных предположений: с 'цели' карты новый список ценностей, это не't действительно имеет значение порядок выполнения. на самом деле, в некоторых средах исполнения генерировать параллельный код, или даже вводить некоторые мемоизация, чтобы избежать вызова для повторяющихся значений, или лень, чтобы избежать вызова одни на всех.
по каждому элементу, с другой стороны, называется специально для побочных эффектов, поэтому порядок важен, и, как правило, может'т быть parallelised.
Короткий ответ: карта
и foreach
разные. Кроме того, неформально говоря, "карта" - это надмножество объекту
.
Ответ: Во-первых, позвольте's прийти с описаниями линии объекту
и карта
:
Во многих языках, объекту
часто называют просто друг
. Следующее обсуждение использует JavaScript только для справки. Это может быть любой другой язык.
Теперь давайте's использовать каждую из этих функций.
Задание 1: написать функцию printSquares
, которая принимает массив чисел Арр
и печатает квадрат каждого элемента в нем.
Решение 1:
var printSquares = function (arr) {
arr.forEach(function (n) {
console.log(n * n);
});
};
Задание 2: написать функцию selfDot
, которая принимает массив чисел Арр
и возвращает массив, в котором каждый элемент является квадратом соответствующего элемента в Арр
.
В сторону: здесь, в жаргонные термины, мы пытаемся площади входного массива. Формально говоря, мы пытаемся вычислить это'ы скалярное произведение с самим собой.
Решение 2:
var selfDot = function (arr) {
return arr.map(function (n) {
return n * n;
});
};
объекту
?Вы можете использовать карты, чтобы решить обе задачи, Задание 1 и Задача 2. Однако, вы не можете использовать объекту
, чтобы решить Задача 2.
В решения 1, Если вы просто замените объекту
по карте
, решение все равно будет действительным. В решения 2 однако, замена "карта" к объекту
будет нарушать ранее рабочего раствора.
объекту
с точки зрения карта
:Другой способ реализации карте
'превосходство является реализация объекту
с точки зрения карта
. Как у нас хорошие программисты, мы'Лл выиграл'т пускаться в пространстве загрязнения. Мы'МР называем наш объекту
, просто друг
.
Array.prototype.each = function (func) {
this.map(func);
};
Теперь, если вы не'т, как "прототип" бред, здесь вы идете:
var each = function (arr, func) {
arr.map(func); // Or map(arr, func);
};
объекту
вообще существует?Ответ эффективность. Если вы не заинтересованы в преобразовании массива в другой массив, почему вы должны вычислить преобразованный массив? Только на свалку его? Конечно, нет! Если вы Don'т хотим, чтобы преобразование, вы должны'т сделать преобразование.
Таким образом, хотя карты могут быть использованы для решения *Задача 1**, он, наверное,'т. Для каждого самый правильный кандидат для этого.
Хотя я во многом согласен с @madlep 'ы ответ, Я'd, как, чтобы указать, что карты()является **строгое супер-сет** из цикла foreach()
.
Да, карта()` обычно используется, чтобы создать новый массив. Тем не менее, он может и быть использованы для изменения текущего выбора.
Здесь'ы пример:
var a = [0, 1, 2, 3, 4], b = null;
b = a.map(function (x) { a[x] = 'What!!'; return x*x; });
console.log(b); // logs [0, 1, 4, 9, 16]
console.log(a); // logs ["What!!", "What!!", "What!!", "What!!", "What!!"]
В приведенном выше примере, " а "был удобно расположен, такие, что[я] === я" за " Я &л; а.длина. Несмотря на это, он демонстрирует силу карты()
.
Здесь's в официальном описании карты()`. Обратите внимание, что карты()может даже изменить массив, для которого он называется! Град
карте()`.
Надеюсь, что это помогло.
Редакция 10-ноя-2015: добавлены уточнения.
Вот пример использования списков Скала: список возвращает карту, возвращает объекту ничего.
def map(f: Int ⇒ Int): List[Int]
def foreach(f: Int ⇒ Unit): Unit
Таким образом карты возвращает список в результате применения функции f к каждому элементу списка:
scala> val list = List(1, 2, 3)
list: List[Int] = List(1, 2, 3)
scala> list map (x => x * 2)
res0: List[Int] = List(2, 4, 6)
По каждому элементу просто применяет F к каждому элементу:
scala> var sum = 0
sum: Int = 0
scala> list foreach (sum += _)
scala> sum
res2: Int = 6 // res1 is empty
Если вы're говоря о JavaScript в частности, разница заключается в том, что "карта" - это функция цикла while объекту
, является итератором.
Использовать "Карта", когда вы хотите применить операцию к каждому элементу списка и получить результаты в новый список, не затрагивая исходный список.
Использование оператора foreach`, когда вы хотите сделать что-то на основе каждого элемента списка. Вы могли бы добавить вещи на страницу, например. По сути, это'ы очень удобно, если вы хотите и"побочные эффекты" по.
Другие отличия: объекту
ничего не возвращает (т. к. действительно управление потоком функция), и переданного в функцию получает ссылки на индекс и весь список, если карту возвращает новый список, а только переходит в текущий элемент.
По каждому элементу пытается применить такую функцию, как писать в БД и т. д. На каждый элемент РДД ничего не возвращаются.
Но карты () применяется некоторая функция над элементами рдд и возвращает рдд. Поэтому при выполнении указанных ниже способ его выиграл'т не в строка3 но при сборе РРУ после нанесения объекту он будет глючить и выдавать ошибку, которая говорит
и GT; файл "&ЛТ;ввода>”, в строке 5, в &ЛТ;модуль>
AttributeError: 'NoneType' объект не имеет атрибут 'сбор'
nums = sc.parallelize([1,2,3,4,5,6,7,8,9,10])
num2 = nums.map(lambda x: x+2)
print ("num2",num2.collect())
num3 = nums.foreach(lambda x : x*x)
print ("num3",num3.collect())