Javascript: estilo sin puntos en callback

Así que quería que los elementos de la matriz arr1 que también pertenecen a la matriz arr2 . Pensé que arr1.filter(arr2.includes) debería hacer el truco, pero me dio un error (ver más abajo). Extrañamente, sin embargo, arr1.filter(x => arr2.incudes(x)) funcionó bien. Aunque las funciones arr2.includes y x => arr2.includes(x) no son referencelmente iguales, ¿no deberían tomar los mismos valores en las mismas inputs? ¿Que me estoy perdiendo aqui?

 > arr1 = ['a', 'b', 'c'] [ 'a', 'b', 'c' ] > arr2 = ['a', 'c', 'd'] [ 'a', 'c', 'd' ] > > arr1.filter(x => arr2.includes(x)) [ 'a', 'c' ] > arr1.filter(arr2.includes) TypeError: Cannot convert undefined or null to object at includes (<anonymous>) at Array.filter (native) at repl:1:6 ... etc ... 

Hay dos razones por las que no puedes hacer arr1.filter(arr2.includes) :

  1. arr2.includes es solo una reference a la function, pero lo que necesita es tanto una reference a la function como a la matriz en la que desea usarla ( arr2 ). Puedes resolver eso usando Function.prototype.bind , pero:

  2. filter pasa su callback a múltiples arguments, no solo a uno: pasa el valor, su índice y la matriz original. includes intentará usar el segundo argumento que recibe como índice para comenzar la búsqueda, de modo que cuando el filter pase al índice, lo usará y saltará las inputs principales.

Entonces, la solución habitual es usar una function de envoltura que sepa que necesita usar includes en arr2 y sepa que solo debe pasarle el único argumento, que es lo que ha hecho con su function de flecha.

Pero vea también la respuesta de Michał Perłakowski para una respuesta desde la perspectiva de la functional programming usando una function de utilidad para crear la function de callback en lugar de crearla en línea.

Aquí se explica cómo podría implementar una function de includes que podría usarse en estilo sin puntos:

 const arr1 = ['a', 'b', 'c']; const arr2 = ['a', 'c', 'd']; const includes = arr => x => arr.includes(x); console.log(arr1.filter(includes(arr2)));