Jumblez les mêmes objets consécutifs dans un tableau de sorte que le tableau de sortie ne comporte pas de valeurs consécutives. Javascript

L'idée de ne pas avoir fondamentalement de valeurs répétées dans le tableau avec des valeurs similaires.

Exemple de tableau contient les valeurs

input = [1,2,2,2,2,3,4,5,6,7,8,9]<br/> 

Production attendue pour avoir quelque chose

 likeoutput = [1,2,3,2,4,2,5,2,6,2,7,8,9]<br/> 

J'ai essayé de mettre cela dans une boucle for avec où il vérifie avec l'élément suivant et si c'est le même, échange les valeurs. Le problème est quand j'ai des valeurs similaires continues.

Cette proposition présente

  • Nombre d'éléments et le stocker dans un objet approprié,
  • Vérifiez si la propagation est possible (par exemple, pas ici [1, 1, 1, 1, 3, 3] ),
  • Round robin avec les éléments, donc
  • Distance maximale entre les mêmes éléments.

Comment ça marche?

Comme exemple, je prends ce tableau: [1, 2, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9]

  1. Créez un objet avec le nombre d'éléments, rangez-le avec l'élément en tant que clé.

     length = { "1": 1, "2": 4, "3": 1, "4": 1, "5": 1, "6": 1, "7": 1, "8": 1, "9": 1 } 
  2. Sélectionnez la propriété avec la plus grande valeur: length[2] = 4
  3. Créez un nouveau tableau avec la longueur de la valeur précédente et complétez-le avec des tableaux vides.

     output = [[], [], [], [], []] 
  4. Vérifiez si un réseau étendu est possible. Sinon, retournez.
  5. Définissez k pour la clé de la plus grande valeur d'une propriété.

     k = '2' 
  6. En vérité, continuez. Sinon, passez à 11.
  7. Réglez l à la valeur de la length[k] .

     l = 4 
  8. Iterate sur l et appuyez sur k jusqu'à la fin du tableau avec l'indice de i % outputLength . Augmenter i .
  9. Supprimer la propriété k .
  10. Procéder avec 5.
  11. Renvoie le tableau de output plat.

     output first then continued array 0: 2 1 6 array 1: 2 3 7 array 2: 2 4 8 array 3: 2 5 9 return: 2 1 6 2 3 7 2 4 8 2 5 9 distance | | | | is equal 
 function spread(input) { function findMaxKey() { var max = 0, key; Object.keys(length).forEach(function (k) { if (length[k] > max) { max = length[k]; key = k; } }); return key; } var length = input.reduce(function (r, a) { r[a] = (r[a] || 0) + 1; return r; }, {}), i = 0, k = findMaxKey(), l, outputLength = length[k], output = Array.apply(Array, { length: outputLength }).map(function () { return []; }); if (input.length - outputLength < outputLength - 1 ) { return; // no spread possible } while (k = findMaxKey()) { l = length[k]; while (l--) { output[i % outputLength].push(k); i++; } delete length[k]; } return output.reduce(function (r, a) { return r.concat(a) }, []); } console.log(spread([1, 2, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9])); console.log(spread([1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2])); console.log(spread([1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3])); console.log(spread([1, 1, 1, 1, 3, 3])); console.log(spread([1, 1, 3])); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

Peut-être que cela pourrait vous aider:

 for(var i = 1; i < input.length; i++) { if(input[i-1] == input[i]) { var j = i; while(j < input.length && input[j] == input[i]) { j++; } var el = input[j]; input[j] = input[i]; input[i] = el; } }