Recientemente, cuando trabajaba en un proyecto en javascript, probé algo similar a este fragmento. Me sorprendió descubrir que no funciona y, en cambio, arroja un error.
const test = [1, 2, 3, 4];
const something = [1, 2, 3, 4, ,5, 6, 7, 8].filter(test.includes);
console.log(something);
TypeError: Cannot convert undefined or null to object
at includes (<anonymous>)
at Array.filter (<anonymous>)
at evalmachine.<anonymous>:3:45
at Script.runInContext (vm.js:74:29)
at Object.runInContext (vm.js:182:6)
at evaluate (/run_dir/repl.js:133:14)
at ReadStream.<anonymous> (/run_dir/repl.js:116:5)
at ReadStream.emit (events.js:180:13)
at addChunk (_stream_readable.js:274:12)
at readableAddChunk (_stream_readable.js:261:11)
¿Es esto un error de JavaScript o estoy entendiendo mal algo aquí? Los siguientes fragmentos funcionan bien:
const test = [1, 2, 3, 4];
const something = [1, 2, 3, 4, ,5, 6, 7, 8].filter(item => test.includes(item));
console.log(something);
Y:
const test = [1, 2, 3, 4];
const someFunc = theThing => test.includes(theThing);
const something = [1, 2, 3, 4, ,5, 6, 7, 8].filter(someFunc);
console.log(something);
Trabajar hacia un estilo de programación más funcional y sin puntos cuando veo los patrones con bastante facilidad, esto parece una inconsistencia.
Editar: esto no es un duplicado. No necesito una aclaración This
, solo sobre cómo se manejó en el contexto de la función de inclusión específicamente.
Se podría utilizar thisArg
de Array#filter
y el prototipo de la función del objeto.
const test = [1, 2, 3, 4];
const something = [1, 2, 3, 4, ,5, 6, 7, 8].filter(Array.prototype.includes, test);
console.log(something);
Pero Array#includes
tiene un segundo parámetro fromIndex
, que es entregado por la función de filtro y es el índice, que puede no ser deseado.
En este caso, es mejor que utilice el estilo directo.
const test = [1, 2, 3, 4];
const something = [1, 2, 3, 4, ,5, 6, 7, 8].filter(v => test.includes(v));
console.log(something);
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras