首页 > 解决方案 > 将数字添加到 JS 数组中的重复 ID

问题描述

我有一个包含用户数据的数组,我需要检查用户名是否已经在数组中,如果是这样,我需要在它后面添加一个数字(user1)。

我能够实现它,但是当有另一个用户具有相同的用户名时,还有另一个 user1。

我需要这个函数来检查数组中是否还有另一个“userxxxx...”,以便添加 user2、user3 等。我尝试使用 .substr() 方法没有运气。

function repeater(user){
  for(i = 0, counter= 0; i < usuarios.length; i++){
    if(user == usuarios[i].usuario.substr(0)){
      counter+= 1;
    }
  }
  return counter;
}
class Usuario
{
  constructor(nombre,apellido,usuario,password,rol,activo,cantRecetas)
  {
      this.nombre = nombre;
      this.apellido = apellido;
      this.usuario = usuario;
      this.password = password;
      this.rol = rol;
      this.activo = activo;
      this.cantRecetas = cantRecetas;
  }
}
function precargaUsuarios() {
  nuevoUsuario("Pedro", "Pérez", "chef", "chef-01", "chef", true);
  nuevoUsuario("Maria", "López", "mlopez", "m-lopez", "colaborador", true);
  nuevoUsuario("José", "Rodríguez", "jrodriguez", "j-rodriguez", "colaborador", false);
  nuevoUsuario("Mateo", "Bacci", "mbacci", "m-bacci", "colaborador", true);
  nuevoUsuario("Juana", "Luppi", "jluppi", "j-luppi", "colaborador", false);
}

function submitUsuario() {

  let nombre = $("#nombreNuevoUsuario").val();
  let apellido = $("#apellidoNuevoUsuario").val();
  let username = (nombre.charAt(0) + apellido).toLowerCase();
  let password = (nombre.charAt(0) + '-' + apellido).toLowerCase();
  let contador = repeater(username);
  if(contador > 0){
    username += contador;
  }
  let rol = "colaborador";
  let activo = true;
  if (nuevoUsuario(nombre, apellido, username, password, rol, activo)) {
    $("#datosNuevoUsuario").html("Nombre de usuario: " + username + "<br> Contraseña: " + password);
    $('#modalNuevoUsuario').modal('hide');
    $("#confirmacionNuevoUsuario").modal('show');
    popularTabla(); //populate
  }
  else{
    let usuarioError = `
    <div style="padding: 5px;">
      <div id="inner-message" class="alert alert-danger alert-dismissible fade show" >
        <button type="button" class="close" data-dismiss="alert">&times;</button>
        Datos inválidos
      </div>
    </div>
    `
    $("#error").html(usuarioError);
  }
}

function nuevoUsuario(nombre, apellido, username, password, rol, activo) {
  let exito = false;
  if (validacionUsuario(nombre, apellido, username, password, rol, activo)) {
    let usuario = new Usuario(nombre, apellido, username, password, rol, activo);
    usuarios.push(usuario);
    exito = true;
  }
  return exito;
}

function validacionUsuario(nombre, apellido) {
  let datosValidados = true;
  if (nombre.length <= 1 || nombre.length > 50) {   //Valido que los campos no estén vacíos
    datosValidados = false;
  }
  if (apellido.length <= 1 || apellido.length > 50) {   // y que no superen los 50 caracteres
    datosValidados = false;
  }
  return datosValidados;
}

标签: javascriptjquery

解决方案


你可以使用递归;这将返回用户名的第一个未使用版本。

const users = [{
  username: "user"
}, {
  username: "user1"
}, {
  username: "user2"
}]


function findUntaken(username, count) {

  if (users.some(user => count > 0 ? user.username === username + count : user.username === username)) {
    return findUntaken(username, count + 1)
  } else {
    return count > 0 ? username + count : username;
  }

}


//returns test
console.log(findUntaken("test", 0))
//returns user3
console.log(findUntaken("user", 0))
//returns user11 (if there was user11, returns user12)
console.log(findUntaken("user1", 0))


推荐阅读