увеличьте скопированный номер строки javascript

#javascript #regex

#javascript #регулярное выражение

Вопрос:

У меня есть список пользователей, и есть дублирующее действие для дублирования выбранного пользователя путем добавления суффикса Copy к имени пользователя.

Итак, если есть имя пользователя john, то дублирующее действие создаст john copy 1, и если теперь пользователь дублирует это «john copy 1», тогда будет «john copy 2» и так далее.

Вот код, который я использую

 private _getDuplicateUserName(userName: string, suffixIndex): string {
    let _duplicateName;
    if (userName.includes("Copy")) {
        _duplicateName = userName.replace(/(d ) /g, (match, number) => {
            const index = parseInt(number, 10)   1;
            return index.toString();
        });
        // for next iteration if this duplicate name exists
        userName = _duplicateName;
    } else {
        _duplicateName = `${userName} Copy ${suffixIndex}`;
    }
    console.log(_duplicateName);
    const _isSameName = this.users.find((_user: User) => _user.userName === _duplicateName);
    if (_isSameName) {
        return this._getDuplicateUserName(userName, suffixIndex   1);
    } else {
        return _duplicateName;
    }
}
 

После создания дублирующего имени пользователя я отправляю нового пользователя this.users с дублирующимся именем пользователя.

это работает, но проблема в том, что если есть имя пользователя john copy 1 copy 1, оно дублирует его с помощью john copy 2 copy 2.

Мне нужно заменить только последнее значение, нужно изменить регулярное выражение, я думаю, любая помощь по этому поводу?

Комментарии:

1. Как мы узнаем, когда мы на самом деле столкнулись с именем пользователя? Как мы узнаем, сколько строк copy может присутствовать?

2. используется userName.replace(/.*b(d )/g, ... для получения последнего номера

3. @anubhava Но здесь нам понадобится замена регулярного выражения обратного вызова, чтобы также выполнить приращение :-)

4. @TimBiegeleisen, я создаю нового пользователя с повторяющимся именем пользователя и отправляю его в объект users.

Ответ №1:

Простая задача может быть решена простой логикой, например, получение последнего символа с использованием array.length .

 var name = 'John';


function changeName(username) {

  if (username.includes('Copy')) {
    const last = username[username.length - 1]

    const count = parseInt(last) //check if valid integer

    if (count) {
      username = username.replace(/.$/, count   1) //replace last char
    } else {
      username  = ' Copy 1';
    }
  } else {

    username  = ' Copy 1';
  }

  name = username;

  console.log('name', name);
}

changeName(name)
changeName(name)
changeName(name)
changeName(name)
changeName(name) 

отказ от ответственности: я не думаю, что это хороший способ дублировать имена. несколько человек могут скопировать John 2, и вы получите несколько John 3. и пользователи также могут называть себя «Copy», а затем ваш код прерывается.