javascript - 将数字添加到 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">×</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;
}
解决方案
你可以使用递归;这将返回用户名的第一个未使用版本。
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))
推荐阅读
- php - 如何使用 PHP 写入文件的特定行?
- python - 如何将 Pandas 系列插入现有 Excel 文件的特定列(不从该文件中删除内容)?
- python - 我可以使用 Python Scapy 库添加 ls() 函数输出中未列出的协议吗?
- android - 关于Bind View位置参数取决于哪些因素?(Recycler View)
- reactjs - 反应路由器组件的名称是什么,而不是打开新链接,而是更改 DOM 并弹出到窗口上?
- python - Django中的多态(派生模型引用)模型继承
- xamarin.forms - 如何在模拟器上运行 mvvmcross Xamarin.Form 应用程序
- java - 如何为jtable设置值?
- ios - 我的反应本机应用程序仅在启用远程调试器时运行,等等当我在设备上安装应用程序时它将无法正常工作
- android - 访问霍尔传感器