Estoy filtrando la matriz de cadenas con un carácter coincidente. La tarea es obtener las cadenas con el carácter "o" de la primera parte de la palabra.
const fruits =["apple orange", "Orange", "banana", "banana", "apple"] const character = "o" const filterdFruits = fruits.filter((item) => item.charAt(0).toLowerCase() === character.toLowerCase()) console.log(filterdFruits)La lógica anterior devolverá el carácter que coincida con la primera letra de la cadena, que es naranja. Pero lo que espero aquí es incluir Orange, apple orange como parte de mi respuesta. Hay una razón por la que quiero que Orange esté en primer lugar, ya que es una coincidencia exacta y, mientras que Apple Orange también es una coincidencia, pero no una coincidencia exacta. Soy reacio a usar expresiones regulares aquí ya que tengo la tendencia a equivocarme. Feliz de obtener algunas direcciones :)
Puede usar este Regexp /\b[o]/gi para identificar palabras que comienzan con o
Importante: esto coincidirá con " Orange"
const fruits =["apple orange", "Orange", "banana", "banana", "apple"] const filterdFruits = fruits.filter((item) => /\b[o]/i.test(item)) console.log(filterdFruits)Dependiendo de sus cadenas en su matriz, usar una expresión regular (sé que dijo que era reacio a usarlas porque siente que puede salir mal, pero pensé en mostrar algunos ejemplos) puede ser suficiente. Aquí hacemos coincidir un límite de palabra \b , seguido de una o :
const fruits =["apple orange", "Orange", "banana", "banana", "apple"] const filterdFruits = fruits.filter(item => /\bo/i.test(item)) console.log(filterdFruits)El límite de la palabra es de longitud cero y coincide con lo siguiente :
- Antes del primer carácter de la cadena, si el primer carácter es un carácter de palabra.
- Después del último carácter de la cadena, si el último carácter es un carácter de palabra.
- Entre dos caracteres en la cadena, donde uno es un carácter de palabra y el otro no es un carácter de palabra.
La primera y la última opción nos permiten hacer coincidir tanto "Orange" como "apple orange" . Tenga en cuenta que el límite de la palabra coincide con los caracteres que no son palabras, por lo que apple $orange también sería una coincidencia válida. Podemos cambiar un poco la expresión regular para arreglar este caso, donde solo hacemos coincidir palabras que comienzan con o ( ^o ) o ( | ) tienen una o después de un carácter de espacio en blanco \so que no esté precedido por ( (?<!) ) el principio de la cadena ^ :
const fruits =["apple orange", "Orange", "banana", "banana", "apple"] const filterdFruits = fruits.filter(item => /^o|(?<!^)\so/i.test(item)) console.log(filterdFruits) En las dos expresiones anteriores, /i significa hacer una coincidencia que no distingue entre mayúsculas y minúsculas. Para hacer que las expresiones anteriores sean dinámicas para que usen el character , puede usar el constructor RegExp , por ejemplo:
const fruits = ["apple orange", "Orange", "banana", "banana", "apple"]; const character = "o"; const filterdFruits = fruits.filter(item => new RegExp(String.raw`\b${character}`, 'i').test(item)) console.log(filterdFruits) Si el character es proporcionado por el usuario, debe comenzar a preocuparse por escapar de su cadena de character para que la expresión regular no se pueda insertar como un valor. No hay formas nativas de escapar de una cadena para que pueda usarse en una expresión regular, por lo que en ese momento, podría considerar usar un enfoque diferente, como el de Terry.
Debería funcionar un pequeño cambio para dividir cada entrada en espacios y verificar cada palabra resultante en busca de una primera letra de 'o':
const fruits = ["apple orange", "Orange", "banana", "banana", "apple", 'plum kiwi Orange'] const character = "o" const filterdFruits = fruits.filter((item) => { return item.split(/\s+/).some(word => { return word.charAt(0).toLowerCase() === character.toLowerCase() }) }); console.log(filterdFruits) .as-console-wrapper { max-height: 100% !important; }