Tengo un const teams . Quiero dividir esta array en dos array . El primer equipo debe ser el equipo sin número en el primer carácter del nombre, y el segundo equipo debe tener números en el primer carácter del equipo.
const [teams, setTeam] = useState([]); const teams = [{id: 1, name: "1-First"}, {id: 2, name: "Winner"}, {id: 3, name: "2-Second"}] // teamsWithNumber var myArray = teams.filter(function (obj) { return obj.name.match('/^[A-Z0-9]/i') }); const teamsWithNumber = myArray; // teamsWithOUTNumber var myArray = teams.filter(function (obj) { return obj.name!== obj.name.match('/^[A-Z0-9]/i') }); const teamsWithOUTNumber = myArray;mi salida es
// console.log(teamsWithOUTNumber) [OUT] []Mi resultado deseado
teamsWithOUTNumber = [id: 2, name: "Winner"}] teamsWithNumber = [{id: 1, name: "1-First"}, {id: 3, "2-Second"}]Su comprensión de RegExp parece tener algunas fallas fundamentales: puede resultarle útil usar una utilidad como Regex101 para ayudarlo con una explicación más sencilla de lo que hace su patrón. Para el que proporcionó anteriormente, la herramienta establece específicamente:
^afirma la posición al comienzo de una línea- Haga coincidir un solo carácter presente en la lista a continuación
[A-Z0-9]
AZcoincide con un solo carácter en el rango entreA(índice65) yZ(índice90) (se distingue entre mayúsculas y minúsculas)0-9coincide con un solo carácter en el rango entre0(índice48) y9(índice57) (se distingue entre mayúsculas y minúsculas)
Dado que ha optado por envolver el literal RegExp entre comillas, también ha incluido sin darse cuenta los caracteres / , que no contiene ninguno de los datos con los que está probando. Como tal, ambos patrones de datos en obj.name nunca coincidirán con este patrón cada vez (con y sin la combinación inicial de dígitos y guiones), lo que lleva a los resultados que está viendo.
En su lugar, adapte el patrón para expresar exactamente lo que espera filtrar en cada matriz. He proporcionado /^\d-/ a continuación, que coincide explícitamente con las cadenas que comienzan con un dígito inicial seguido de un guión. Esto debería coincidir más estrechamente con lo que parece estar buscando.
De manera un tanto tangencial, dado que no está tratando de extraer ningún dato en este escenario, también debe optar por RegExp.test() en lugar de String.match() .
Finalmente, puede hacer que su código cumpla con sus requisitos y sea un poco más breve ejecutando filter en la misma matriz original y almacenando el resultado en dos variables separadas: una operación para filtrar aquellas que se ajustan al patrón ^\d- ( teamsWithNumber ) , y los que no ( teamsWithOUTNumber ):
const teams = [{ id: 1, name: "1-First" }, { id: 2, name: "Winner" }, { id: 3, name: "2-Second" } ] const teamsWithNumber = teams.filter(obj => /^\d-/.test(obj.name)); const teamsWithOUTNumber = teams.filter(obj => /^(?!\d-)/.test(obj.name)); console.log(teamsWithNumber, teamsWithOUTNumber);¿Puedes probar esto? Cambié los valores devueltos de los filtros.
const [teams, setTeam] = useState([]); const teams = [{id: 1, name: "1-First"}, {id: 2, name: "Winner"}, {id: 3, name: "2-Second"}] // teamsWithNumber var myArray = teams.filter(function (obj) { return !/^[-]?\d+$/.test(obj.name[0]); }); const teamsWithNumber = myArray; // teamsWithOUTNumber var myArray = teams.filter(function (obj) { return !/^[-]?\d+$/.test(obj.name[0]); }); const teamsWithOUTNumber = myArray;.match('/^[A-Z0-9]/i') no funcionará, el literal RegExp es una cadena: use .match(/^[A-Z0-9]/i) .
En realidad, solo necesita probar /^\d/ (el primer carácter de la cadena a probar es un número). Compruebe RegExp @ MDN .
Puedes usar un reductor usando esa prueba, algo así como
const teams = [{ id: 1, name: "1-First" }, { id: 2, name: "Winner" }, { id: 3, name: "2-Second" } ]; const [numbered, notNumbered] = teams .reduce(([t1, t2], val) => [...[t1, t2], /^\d/.test(val.name) ? t1.push(val) : t2.push(val)], [ [], [] ]); console.log(`with number: ${ JSON.stringify(numbered)}, \nno number: ${ JSON.stringify(notNumbered)}`);