2017-07-29 3 views
0

Je demande de l'aide pour résoudre le problème de renommer les chaînes dans le tableau qui ressemble à ceci:Renommer les doublons dans un tableau JavaScript

["a(1)","a(6)","a","a","a","a","a","a","a","a","a","a"] 

Après l'exécution de la fonction, il doit se présenter comme suit:

["a(1)","a(6)","a","a(2)","a(3)","a(4)","a(5)","a(7)","a(8)","a(9)","a(10)","a(11)"] 

La matrice vide et la matrice exempte de doublons ne doivent pas être touchées.

Mon idée est de remplir un objet vide avec des paires clé/valeur et puis juste les pousser à un nouveau tableau:

function renameFiles(arr){ 
    var itemsObj = {}; 
    var count = 1; 
    for (var i = 0; i < arr.length; i++){ 

     itemsObj[arr[i]] = count; 
     // if the key present, rename the array item and add it to the 
     // itemsObj 
     if (arr[i] in itemsObj){ 
      itemsObj[arr[i] + '(' + (i - (i - 1)) + ')'] 
     } 

    } 
    console.log(itemsObj) 
    // once the itmesObj is set, run the loop and push the keys to the 
    // array 
    return arr; 

} 

var array = ["a(1)","a(6)","a","a","a","a","a","a","a","a","a","a"] 
renameFiles(array); 

Le problème est que la itemsObj est d'obtenir peuplé pas avec les clés de doublons. Il devrait y avoir une autre méthode qui peut gérer cette tâche. Je suis un débutant et probablement pas au courant de cette méthode.

Répondre

1

Vous y êtes presque. Vous souhaitez garder un compte et vérifier les doublons, puis effectuez une autre vérification des doublons avec parenthèses et mettre à jour le compte de façon appropriée

function renameFiles(arr){ 
 
    var count = {}; 
 
    arr.forEach(function(x,i) { 
 

 
    if (arr.indexOf(x) !== i) { 
 
     var c = x in count ? count[x] = count[x] + 1 : count[x] = 1; 
 
     var j = c + 1; 
 
     var k = x + '(' + j + ')'; 
 

 
     while(arr.indexOf(k) !== -1) k = x + '(' + (++j) + ')'; 
 
     arr[i] = k; 
 
    } 
 
    }); 
 
    return arr; 
 
} 
 

 
var res = renameFiles(["a(1)","a(6)","a","a","a","a","a","a","a","a","a","a"]); 
 
console.log(res)
.as-console-wrapper {top:0; max-height:100%!important}

+0

Hmmm. vous apprenez quelque chose de nouveau chaque jour. Je ne savais pas que vous pourriez incrémenter à l'intérieur d'un opérateur ternaire. – Skam

+0

@Skam - Vous pouvez incrémenter très bien, mais en vous appuyant sur le résultat de l'assigment, comme je le fais ci-dessus, vous devriez éviter dans de nombreux cas, du moins à mon avis. Je l'ai fait ici pour éviter tout le désordre du 'if/else' vérifiant des clefs etc., et je pense que c'est bien car il ne devrait y avoir aucun problème le faisant de cette façon * dans ce cas spécifique *! – adeneo

+0

@adeneo Pourriez-vous expliquer cette ligne 'var c = x en nombre? count [x] = count [x] + 1: count [x] = 1; 'Je ne connais pas encore ce genre de style. – Yunielf

1

Vous étiez sur la bonne voie.

Une autre solution,

(function(){ 
    var renameFiles = function(arr){ 
     var counts = {} 
     for(var i=0;i<arr.length;i++){ 
      if(!counts[arr[i]]) 
       counts[arr[i]]=0; 
      counts[arr[i]]++; 
     } 
     arr = []; 
     for(var name in counts){ 
      for(var i=0;i<counts[name];i++){ 
       arr.push(name+(i===0?'':'('+i+')')); 
      } 
     } 
     return arr; 
    } 

    var array = ["a(1)","a(6)","a","a","a","a","a","a","a","a","a","a"]; 
    console.log(renameFiles(array)) 
})(); 
+0

Bon indice, je vais ajuster mon code. Je vous remercie! – Yunielf