El siguiente es el código en el que necesito alguna aclaración. Esperaba que este código consolara 'mango', 'apple', 'orange' uno por uno, similar a la Opción 2 , pero esto arroja otra entrada que no entiendo cómo JavaScript está escupiendo esta salida.

const myFunc = (...data) => (data.map(console.log))

myFunc('mango', 'apple', 'orange')

Opción 2 - (Salida esperada)

var myFunc = (...data) => {
  data.map(x => {
    console.log(x)
  })
}

myFunc('mango', 'apple', 'orange')

Corrija mi comprensión con esto, por favor, ya que estaba pensando que data.map(console.log) registrará solo los elementos.

1
Nesh 23 jun. 2020 a las 23:50

5 respuestas

La mejor respuesta

Su código funciona bien y debería producir el resultado esperado para otras funciones.

Array#map acepta una función de devolución de llamada, que llamará para cada elemento de la matriz. MDN:

La función de devolución de llamada acepta los siguientes argumentos:

currentValue
El elemento actual que se procesa en la matriz.

indexOptional
El índice del elemento actual que se procesa en la matriz.

arrayOptional
Se solicitó el mapa de matriz.

Debido a que está pasando console.log como la función de devolución de llamada, efectivamente está escribiendo esto:

const myFunc = (...data) => (data.map((curVal,index,arr) => console.log(curVal,index,arr)))

myFunc('mango', 'apple', 'orange')

Por lo tanto, la salida adicional se debe a que también está registrando los parámetros index y array sin saberlo.

Solo tenga en cuenta que cualquier otra función que use también recibirá estos parámetros adicionales. Si solo aceptan un parámetro, debería funcionar exactamente como espera.

7
Klaycon 23 jun. 2020 a las 21:03

console.log toma más de un parámetro.

Puede ajustar su función en otra función y usar solo el primer parámetro.

forEach es mejor si el resultado de map nunca se usa.

const single = fn => first => fn(first);

var myFunc = (...data) => {
    data.forEach(single(console.log));
}

myFunc('mango', 'apple', 'orange')
3
Nina Scholz 23 jun. 2020 a las 20:55

Esto es lo que map hace debajo del capó:

function map(a, f) {
  var b = new Array(a.length);
  for (let i = 0; i < a.length; i++) {
    b[i] = f(a[i], i, a);
  }
  return b;
}

console.log(
  map([0, 1, 2, 3], function(x, i, a) {
    return x * x;
  })
);

Como puede ver, f recibe 3 parámetros: el elemento a[i], su posición i y la matriz a. Depende de usted usarlos o no, como se muestra en estos ejemplos retorcidos:

console.log(
  ["a", "b", "c", "d"].map(function(x, i, a) {
    return x + " " + a[(i + 1) % a.length];
  })
);

console.log(
  ["a", "b", "c", "d"].map(function(_, i) {
    return "2^" + i + " = " + 2 ** i;
  })
);

Dado que console.log toma cualquier número de parámetros, si lo pasa directamente a map, usará los tres parámetros a[i], i y a. Para elegir solo un parámetro, necesita un filtro:

"abcd".split("").map(function(x) {
  console.log(x);
});

Sin embargo, como dijo Nina, forEach es más apropiado en este caso ya que ignoramos la salida de map (que es [undefined × 4]):

"abcd".split("").forEach(function(x) {
  console.log(x);
});
1
leaf 24 jun. 2020 a las 09:07

El resultado en Opción 1 será: -

mango 0 (3) ["mango", "apple", "orange"]
apple 1 (3) ["mango", "apple", "orange"]
orange 2 (3) ["mango", "apple", "orange"]

Esto se debe a las siguientes 2 razones: -

El método map () crea una nueva matriz con los resultados de llamar a una función para cada elemento de la matriz. El método map () llama a la función proporcionada una vez para cada elemento de una matriz, en orden.

0
SAURABH 23 jun. 2020 a las 20:58

Puede escribirlos todos en un archivo console.log. Si los quiere en líneas separadas, puede agregar \ n al final de cada elemento.

-3
Christoffer Hennie 23 jun. 2020 a las 20:55