Je veux pousser un nom dans un tableau, le nom sera un nom par défaut.
Si le nom existe déjà, je dois y ajouter un entier avant de pousser, quelque chose comme incrémenter si l'instance existe.

S'il n'existe pas, il devrait créer une instance, fera la même chose dans l'ensemble du processus, mais il devrait s'incrémenter.

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.log(arr)

Ce que j'attends comme résultat, c'est quelque chose comme ça :

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

Le bloc de code fonctionne déjà sauf que s'il n'y a pas d'instance de 'team apple' dans le tableau, il a commencé à planter

Si le tableau ressemble à ceci, tout fonctionne bien :

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

Mais si ça ressemble à ça :

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

Le navigateur commence à planter.

C'est la partie du code qui le cause, je n'en ai aucune idée.

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
}

Je ne suis même pas sûr que ce soit la bonne implémentation pour cela, si je voulais vraiment un nom incrémentiel. toute suggestion sera d'une grande aide. aussi je suis limité seulement à ES5.

Merci d'avance

3
eric bon 17 mars 2019 à 11:35

2 réponses

Meilleure réponse

C'est beaucoup plus facile d'utiliser un filtre et de prendre la longueur résultante comme suffixe. Il y a beaucoup de boucles dans votre code, et il n'en faudrait qu'une

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.log(addToArr(arr, name));
console.log(addToArr(arr, name));
console.log(addToArr(arr, name));

Version ES5

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.log(addToArr(arr, name));
console.log(addToArr(arr, name));
console.log(addToArr(arr, name));
3
baao 17 mars 2019 à 08:48

Il vous suffit de déterminer combien d'instances de l'équipe à ajouter existent dans le tableau. Pour cela, vous pouvez utiliser Array.filter (voir MDN) ou votre propre méthode de filtrage. Quelque chose comme:

(() => {
  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.log(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.log(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;
  }
})()
1
KooiInc 17 mars 2019 à 09:38