Cuando menciono usuarios, si menciono a un usuario más de una vez, obtengo una cadena como:
"@[Firstname Lastname](4652) @[Firstname Lastname](4652) @[Firstname Lastname](4652)" Traté de filtrar para que la carga útil contenga solo uno de esos valores. ( @[Firstname Lastname](4652) ) El primer problema que tuve es que el espacio es opcional, por lo que no pude dividir la matriz (creé una matriz a partir de una cadena) por espacio. Si lo divido con @, no envía la @ en la carga útil. Supongo que debería crear algún tipo de expresión regular que compare el texto entre '@' y el último ')', según la ID de uso que está entre paréntesis. Pero no pude crear uno. Otro problema es que los usuarios también pueden escribir texto, no solo mencionar a los usuarios, por lo que podría verse así:
"bla bla @[Firstname Lastname](4652) bla bla @[Firstname Lastname](4652) bla bla"Primero puede dividir toda la cadena usando split(" ")
const string = "bla bla @[Firstname Lastname](4652) bla bla @[Firstname Lastname](4652) bla bla"; const stringArr = string.split(" "); //Split the string into array of strings let users = []; const userPattern = /@[az]*)/i; //Begins with `@` and ends with `)` stringArr.forEach((item) => { if(userPattern.test(item) { users.append(item); } }); users = unique(users);Función para eliminar duplicados
function unique(a) { var seen = {}; var out = []; var len = a.length; var j = 0; for(var i = 0; i < len; i++) { var item = a[i]; if(seen[item] !== 1) { seen[item] = 1; out[j++] = item; //Adding unique arrays to this array } } return out; }Espero que esto ayude 😊
Creo que "@" es la forma más segura de dividir la cadena porque eso garantiza que solo haya una identificación de usuario presente en cada elemento. Dado que "@" siempre va seguido de "[", se puede volver a agregar usando:
dataPart.replace("[", "@[");Ese problema se resolvió, se convierte en un caso de realizar un seguimiento de los números de identificación a medida que los agrega a una nueva matriz o cadena de 'carga útil'.
En la implementación sugerida en mi fragmento, los datos se dividen en "@" en una matriz. Luego, la matriz se repite utilizando forEach . Cada elemento se examina para detectar la presencia de un número de identificación, que se encuentra por la presencia de "(". Se agregan nuevas identificaciones a una matriz seen que se puede verificar durante los bucles posteriores para ver si la identificación se ha visto antes. Si la identificación es único, el elemento se transfiere a la carga útil (y la identificación se agrega a seen ).
Las limitaciones son que la identificación debe ser la única parte encerrada entre corchetes "()", y si hay texto adicional en las repeticiones posteriores de una identificación determinada, se perderá (pero el texto al principio persistirá).
let atList = "hello @[Firstname Lastname](4652) @[Firstname Lastname](4652) @[Firstname Lastname](2352) @[Firstname Lastname](4652) @[Firstname Lastname](1637)"; const parts = atList.split("@"); const payload = []; const seen = []; parts.forEach(element => { currentId = element.slice(element.indexOf("(")+1,element.indexOf(")")); if (seen.indexOf(currentId) == -1 && element.length > 0) { payload.push(element.replace("[", "@[")); seen.push(currentId); } }); payloadString = payload.join(""); console.log(payloadString);Primero, simplemente divida la cadena en una matriz al final de cada nombre de usuario, que es el carácter ) . Elimine todos los caracteres antes del símbolo @ , luego agregue el nuevo elemento de matriz a una segunda matriz si aún no está presente.
EDITAR: código hecho ejecutable
function getUsernames(string) { var array = [] // Second Empty Array for (var s of string.split(")")) { // For Loop through first 'split' array if (!array.includes(s.substring(s.indexOf("@"))+")") && s.includes("@")) array.push(s.substring(s.indexOf("@"))+")") // If the second array doesn't have the split element, add it } return(array) } console.log(getUsernames("@[Firstname Lastname](4652) @[Firstname Lastname](4652) @[Firstname Lastname](4652)")) // Print out your refined array of usernames console.log(getUsernames("@[Firstname Lastname](0001) abcd @[Firstname Lastname](0002) 1234 @[Firstname Lastname](0003) <?/[}")) // Print out your refined array of usernames