Quiero devolver _1, _2 y no _1, _2, _1:
let regex = /_[0-9]/g; let string = 'a_1 b_2 c_1'; let matches = [...string.matchAll(regex)]; let unique = [...new Set(matches)]; alert(unique);¿No ves por qué no elimina los duplicados?
Está utilizando .matchAll , que devolverá un iterador que, cuando se convierte en una matriz, da como resultado:
[ ['_1', index: 1, input: 'a_1 b_2 c_1', groups: undefined], ['_2', index: 5, input: 'a_1 b_2 c_1', groups: undefined], ['_1', index: 9, input: 'a_1 b_2 c_1', groups: undefined] ]Por lo tanto, la deduplicación de los elementos de la matriz con un Conjunto no funciona: las matrices nunca son === entre sí.
Use .match en lugar de .matchAll para obtener una matriz de coincidencias (cadenas), no una matriz de matrices.
const regex = /_[0-9]/g; const string = 'a_1 b_2 c_1'; const matches = string.match(regex); const uniqueMatches = [...new Set(matches)]; console.log(uniqueMatches);Sin usar un método diferente, matchAll podría no ser el mejor aquí, aplane la matriz de coincidencias antes de pasar al constructor Set:
let regex = /_[0-9]/g; let string = 'a_1 b_2 c_1'; let matches = [...string.matchAll(regex)].flat(); let unique = [...new Set(matches)]; console.log(unique);