let array1 = ["?", "!", "."]; let array2 = ["live.", "ali!", "harp", "sharp%", "armstrong","yep?"]; console.log(array2.filter((x) => x.endsWith("?"))); El resultado es simplemente: ['yep?']
Debido a que la función endsWith() solo verificó "?" como ves en el código. ¿Cómo hago un bucle de los elementos en el array1 (sufijos) dentro de la función endsWith para que el resultado sea:
['live.', 'ali!', 'yep?']Puede usar una expresión regular y luego hacer match cada elemento en la iteración del filter con él.
/[?!.]$/ dice que coincida con una de estas cosas en el grupo ( [?!.] ) antes de que termine la cadena ( $ ).
const arr = ['live.', 'ali!', 'harp', 'sharp%', 'armstrong', 'yep?']; const re = /[?!.]$/; const out = arr.filter(el => el.match(re)); console.log(out);Con respecto a su comentario, puede pasar una matriz unida al constructor RegExp usando una cadena de plantilla .
const query = ['.', '?', '!']; const re = new RegExp(`[${query.join('')}]$`); const arr = ['live.', 'ali!', 'harp', 'sharp%', 'armstrong', 'yep?']; const out = arr.filter(el => el.match(re)); console.log(out);Puede usar una llamada interna .some() para recorrer su array1 y devolver true cuando encuentre una coincidencia en lugar de codificar el ? :
const array1 = ["?", "!", "."]; const array2 = ["live.", "ali!", "harp", "sharp%", "armstrong","yep?"]; const res = array2.filter((x) => array1.some(punc => x.endsWith(punc))); console.log(res); Arriba, cuando devuelve true (o un valor verdadero) desde la devolución de llamada .some .some() , el método .some() devolverá true , de lo contrario, devolverá false si nunca devuelve verdadero, descartándolo.