Existe uma diferença entre foreach e mapa?

votos
199

Ok esta é mais uma questão de ciência da computação, do que uma pergunta com base em uma linguagem particular, mas há uma diferença entre uma operação de mapa e uma operação de foreach? Ou eles são simplesmente nomes diferentes para a mesma coisa?

Publicado 10/12/2008 em 03:09
fonte usuário
Em outras línguas...                            


8 respostas

votos
277

Diferente.

itera foreach mais de uma lista e aplica-se alguma operação com efeitos colaterais para cada membro da lista (tais como poupança de cada um para o banco de dados, por exemplo)

mapa itera sobre uma lista, transforma cada membro da referida lista, e retorna uma outra lista do mesmo tamanho com os membros transformadas (tais como a conversão de uma lista de strings para maiúsculas)

Respondeu 10/12/2008 em 03:14
fonte usuário

votos
110

A diferença importante entre eles é que mapse acumula todos os resultados em uma coleção, enquanto foreachretorna nada. mapgeralmente é usado quando você quer transformar uma coleção de elementos com uma função, enquanto que foreachsimplesmente executa uma ação para cada elemento.

Respondeu 10/12/2008 em 03:15
fonte usuário

votos
38

Em suma, foreaché para a aplicação de uma operação em cada elemento de um conjunto de elementos, enquanto que mapé para transformar uma recolha para outro.

Existem duas diferenças significativas entre foreache map.

  1. foreachnão tem restrições conceituais sobre a operação se aplica, à excepção talvez aceitar um elemento como argumento. Ou seja, a operação pode não fazer nada, pode ter um efeito colateral, pode retornar um valor ou não pode retornar um valor. Todos foreachse preocupa é a iteração sobre uma coleção de elementos, e aplicar a operação em cada elemento.

    map, Por outro lado, tem uma restrição sobre a operação: ele espera que a operação para retornar um elemento, e provavelmente também aceitar um elemento como argumento. Os mapitera operação mais de um conjunto de elementos, aplicando-se a operação em cada elemento, e, finalmente, armazenando o resultado de cada invocação da operação para uma outra recolha. Em outras palavras, o map transforma uma coleção para outra.

  2. foreachtrabalha com um único conjunto de elementos. Esta é a coleção de entrada.

    map trabalha com duas coleções de elementos: a coleção de entrada ea coleta de saída.

Não é um erro relacionar os dois algoritmos: na verdade, você pode ver os dois hierarquicamente, onde mapé uma especialização de foreach. Ou seja, você pode usar foreache ter a operação de transformar seu argumento e inseri-lo em uma outra coleção. Assim, o foreachalgoritmo é uma abstração, uma generalização, do mapalgoritmo. Na verdade, porque foreachnão tem nenhuma restrição sobre o seu funcionamento, podemos dizer com segurança que foreaché o mecanismo de looping mais simples lá fora, e ele pode fazer qualquer coisa que um laço pode fazer. map, Bem como outros algoritmos mais especializados, está lá para expressividade: se você deseja mapear (ou transformar) uma coleção para outra, sua intenção é clara, se você usar mapdo que se você usar foreach.

Podemos estender essa discussão adiante, e considerar o copyalgoritmo: um laço que clona uma coleção. Este algoritmo também é uma especialização do foreachalgoritmo. Pode-se definir uma operação que, tendo em conta um elemento, que irá inserir mesmo elemento para uma outra recolha. Se você usar foreachcom essa operação que com efeito executou o copyalgoritmo, embora com reduzida clareza, expressividade ou explicitação. Vamos levá-lo ainda mais longe: Podemos dizer que mapé uma especialização de copy, ela própria uma especialização de foreach. mappode mudar qualquer um dos elementos que itera sobre. Se mapnão alterar qualquer dos elementos, em seguida, ele apenas copiou os elementos, e usando cópia expressaria a intenção mais claramente.

o foreach algoritmo em si pode ou não pode ter um valor de retorno, dependendo do idioma. Em C ++, por exemplo, foreachretorna a operação que originalmente recebido. A ideia é que a operação pode ter um estado, e você pode querer que a operação de volta para inspecionar como ele evoluiu ao longo dos elementos. mapTambém pode ou não retornar um valor. Em C ++ transform(o equivalente para mapaqui) acontece para retornar uma iteração para a extremidade do recipiente de saída (recolha). Em Ruby, o valor de retorno mapé a sequência de saída (recolha). Assim, o valor de retorno dos algoritmos é realmente um detalhe de implementação; seu efeito pode ou não ser o que eles retornam.

Respondeu 28/05/2010 em 22:52
fonte usuário

votos
30

Array.protototype.mapmétodo e Array.protototype.forEachsão ambos muito semelhantes.

Execute o seguinte código: 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));
});

Eles dão o resultado ditto exato.

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

Mas a reviravolta vem quando você executar o seguinte código: -

Aqui eu simplesmente atribuído o resultado do valor de retorno a partir do mapa e forEach métodos.

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();

Agora, o resultado é algo complicado!

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

Conclusão

Array.prototype.mapretorna uma matriz, mas Array.prototype.forEachnão o faz. Então você pode manipular a matriz retornada dentro da função callback passado para o método mapa e, em seguida, devolvê-lo.

Array.prototype.forEach única anda através da matriz dada para que você possa fazer suas coisas enquanto caminhava a matriz.

Respondeu 29/01/2013 em 11:56
fonte usuário

votos
11

Resposta curta: map e forEachsão diferentes. Além disso, informalmente falando, mapé um super rigoroso de forEach.

Resposta longa: Primeiro, vamos chegar a um descrições de linha de forEache map:

  • forEach itera sobre todos os elementos, chamando a função fornecida em cada um.
  • map itera sobre todos os elementos, chamando a função fornecida em cada, e produz uma matriz transformado por lembrar o resultado de cada chamada de função.

Em muitas línguas, forEaché muitas vezes chamado simplesmente each. A discussão a seguir usa JavaScript apenas para referência. Ele poderia realmente ser qualquer outra língua.

Agora, vamos usar cada uma dessas funções.

usando forEach:

Tarefa 1: Adicione uma função printSquares, a qual aceita uma matriz de números arr, e imprime o quadrado de cada um dos elementos nele.

Solução 1:

var printSquares = function (arr) {
    arr.forEach(function (n) {
        console.log(n * n);
    });
};

usando map:

Tarefa 2: Adicione uma função selfDot, a qual aceita uma matriz de números arr, e retorna uma matriz em que cada elemento é o quadrado do elemento correspondente arr.

Aparte: Aqui, em termos de gíria, estamos tentando fazer a quadratura do array de entrada. Formalmente colocado, estamos tentando calcular é produto escalar com ele mesmo.

Solução 2:

var selfDot = function (arr) {
    return arr.map(function (n) {
        return n * n;
    });
};

Como é mapum super- forEach?

Você pode usar mappara resolver as duas tarefas, Tarefa 1 e Tarefa 2 . No entanto, você não pode usar forEachpara resolver o Tarefa 2 .

Em Solução 1 , se você simplesmente substituir forEachpor map, a solução ainda será válido. Em Solução 2 no entanto, a substituição mappor forEachvai quebrar a sua solução previamente trabalhando.

Implementação forEachem termos de map:

Outra forma de realizar mapa superioridade 's é implementar forEachem termos de map. Como somos bons programadores, vamos não vai entrar em poluição namespace. Vamos chamar nosso forEach, apenas each.

Array.prototype.each = function (func) {
    this.map(func);
};

Agora, se você não gosta do prototypeabsurdo, aqui vai:

var each = function (arr, func) {
    arr.map(func); // Or map(arr, func);
};

Então, umm .. Por que é que forEachainda existe?

A resposta é eficiência. Se você não está interessado em transformar um array para outro array, por que você deve calcular a matriz transformada? Só para despejá-lo? Claro que não! Se você não quer uma transformação, você não deve fazer uma transformação.

Assim, enquanto mapa pode ser usado para resolver Tarefa 1 , provavelmente não deveria. Para cada um é o candidato certo para isso.


Resposta original:

Enquanto eu em grande parte de acordo com a resposta de @madlep, eu gostaria de salientar que map()é uma estrita super-conjunto de forEach().

Sim, map()é geralmente usado para criar uma nova matriz. No entanto, pode também ser usado para alterar o conjunto de corrente.

Aqui está um exemplo:

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!!"]

No exemplo acima, afoi convenientemente fixado de tal modo que a[i] === ipara i < a.length. Mesmo assim, ele demonstra o poder da map().

Aqui está a descrição oficialmap() . Note que map()pode até mudar a matriz em que é chamado! Hail map().

Espero que este ajudou.


Editado 10-Nov-2015: elaboração Adicionado.

Respondeu 29/07/2014 em 09:01
fonte usuário

votos
11

a diferença mais 'visível' é que o mapa acumula o resultado em uma nova coleção, enquanto foreach é feito apenas para a própria execução.

mas há um par de pressupostos extras: uma vez que o 'propósito' de mapa é a nova lista de valores, isso realmente não importa a ordem de execução. De fato, alguns ambientes de execução gerar código paralelo, ou mesmo introduzir algum memoizing para evitar chamar para valores repetidos, ou preguiça, para evitar chamar alguns em tudo.

foreach, por outro lado, chama-se especificamente para os efeitos colaterais; portanto, a ordem é importante, e geralmente não podem ser paralelizado.

Respondeu 10/12/2008 em 03:59
fonte usuário

votos
3

Aqui está um exemplo em Scala usando listas: lista de mapa regressa foreach não retorna nada.

def map(f: Int ⇒ Int): List[Int]
def foreach(f: Int ⇒ Unit): Unit

Assim mapa retorna a lista resultante da aplicação da função f para cada elemento da lista:

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)

Foreach apenas se aplica f a cada elemento:

scala> var sum = 0
sum: Int = 0

scala> list foreach (sum += _)

scala> sum
res2: Int = 6 // res1 is empty
Respondeu 13/05/2014 em 08:56
fonte usuário

votos
2

Se você está falando de Javascript em particular, a diferença é que mapé uma função loop while forEaché um iterador.

Use mapquando você deseja aplicar uma operação para cada membro da lista e obter os resultados de volta como uma nova lista, sem afetar a lista original.

Use forEachquando você quer fazer algo sobre a base de cada elemento da lista. Você pode estar adicionando coisas para a página, por exemplo. Essencialmente, é ótimo para quando você quiser "efeitos colaterais".

Outras diferenças: forEachnão retorna nada (uma vez que é realmente uma função de controle de fluxo), e a função passou-in recebe referências para o índice e toda a lista, enquanto mapa retorna a nova lista e só passa no elemento atual.

Respondeu 10/12/2008 em 03:19
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more