Javascript: увеличить имя, если оно существует

Я хочу поместить имя в массив, имя будет именем по умолчанию.
Если имя уже существует, мне нужно добавить к нему целое число перед нажатием, что-то вроде увеличения, если экземпляр существует.

Если он не существует, он должен создать экземпляр, будет делать то же самое во всем процессе, но он должен увеличиваться.

var arr = ['team banana', 'team melon', 'team melon 2', 'team orange'] 
var name = 'team apple'; // this is default team name
var xarr = [];

if (arr.length){
    // store the all instances of 'team apple'
    for(var c = 0; c <= arr.length; c++){
        if (arr[c] !== undefined){
            if (arr[c].indexOf('team apple')  > -1){
                xarr.push(arr[c].replace(/['0-9']/g,''))
            }
        }
    }
    // start the iterration
    for (var k=0; k<=arr.length; k++){
        // if existing
        if (arr[k] !== undefined){
            if (name === arr[k]) {
                arr.push(name+' ' + ( xarr.length))
            }else{
                // if not existing creat an instance of 'team apple'
                // arr.push(name) <--- this cause the browser to crash
            }
        }
    }
    xarr = []
}else{
    arr.push(name )
}

console.info(arr)

В результате я ожидаю что-то вроде этого:

['team banana', 'team melon', 'team melon 2', 'team orange','team apple','team apple 1', 'team apple 2' ...]

Блок кода уже работает, за исключением того, что если в массиве нет экземпляра «команды Apple», он начал падать

Если массив выглядит так, все работает хорошо:

['team banana', 'team melon', 'team melon 2', 'team orange','team apple']

Но если это выглядит так:

['team banana', 'team melon', 'team melon 2', 'team orange']

Это браузер начинает крашиться.

Это часть кода, которая вызывает это, я понятия не имею.

if (name === arr[k]) {
    arr.push(name+' ' + (xarr.length))
}else{
    // if not existing creat an instance of 'team apple'
    // arr.push(name) <--- this cause the browser to crash
}

Я даже не уверен, что это правильная реализация для этого, если бы я действительно хотел, это увеличивающееся имя. любое предложение будет огромной помощью. также я ограничен только ES5.

заранее спасибо

Вы уверены, что push приводит к сбою браузера?

Jack Bashford 17.03.2019 09:38

@JackBashford да, он вылетает, в результате я закрываю браузер с сообщением об ошибке «Приостановлено до потенциального сбоя памяти»

eric bon 17.03.2019 09:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
2
549
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Гораздо проще просто использовать фильтр и взять полученную длину в качестве постфикса. В вашем коде много циклов, и нужен только один

const arr = ['team banana', 'team melon', 'team melon 2', 'team orange']
const name = 'team apple';

function addToArr(arr, name) {
  const postfix = arr.filter(e => e.replace(/\s\d+$/, '') === name).length || '';
  arr.push(`${name} ${postfix}`.trim());
  return arr;
}

console.info(addToArr(arr, name));
console.info(addToArr(arr, name));
console.info(addToArr(arr, name));

Версия ES 5

var arr = ['team banana', 'team melon', 'team melon 2', 'team orange']
var name = 'team apple';

function addToArr(arr, name) {
  var postfix = arr.filter(function(e) { return e.replace(/\s\d+$/, '') === name}).length || '';
  arr.push((name + ' ' + postfix).trim());
  return arr;
}

console.info(addToArr(arr, name));
console.info(addToArr(arr, name));
console.info(addToArr(arr, name));

Вам нужно только определить, сколько экземпляров команды для добавления существует в массиве. Для этого вы можете использовать Array.filter (см. MDN) или собственный метод фильтрации. Что-то типа:

(() => {
  let arr = ['team banana', 'team melon', 'team melon 2', 'team orange'];
  const teamApple = "team apple";

  addTeam(teamApple, arr);
  addTeam(teamApple, arr);
  addTeam(teamApple, arr);
  addTeam(teamApple, arr);
  addTeamAlternative(teamApple, arr);
  console.info(arr);
  
  // will it work for an empty array?
  let newArr = [];
  addTeamAlternative(teamApple, newArr);
  addTeamAlternative(teamApple, newArr);
  addTeam("team kiwifruit", newArr);
  addTeam("team kiwifruit", newArr);
  console.info(newArr);
  
  // Array.filter and ES20xx
  function addTeam(team, someArr) {
    const nExisting = someArr.filter(teamFromArray => teamFromArray.startsWith(team)).length;
    someArr.push(team + (nExisting == 0 ? "" : ` ${nExisting + 1}`));
    return someArr;
  }
  
  // Your own method (a more 'classic' alternative)
  function addTeamAlternative(team, someArr) {
    var arrSearch = someArr.slice(0);
    var value = arrSearch.shift();
    var nExisting = 1;
    while(value) {
      nExisting += +RegExp("^" + team).test(value);
      value = arrSearch.shift();
    }
    someArr.push(team + (nExisting > 1 ? (" " + nExisting) : ""));
    return someArr;
  }
})()

Другие вопросы по теме