J'ai créé une fonction qui trouve l'élément le plus fréquent d'un tableau JS avec deux boucles pour et affiche l'élément et le nombre de fois qu'il y a dans le tableau. Comment puis-je le faire avec une boucle while?

var arr = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3];

//ta = times appeared / m = max / arrchar = array character
var ta = 1;
var m = 0;
var arrchar;

for (var i = 0; i < arr.length; i++) {
  for (var j = i; j < arr.length; j++) {
    if (arr[i] == arr[j])
      m++;
    if (ta < m) {
      ta = m;
      arrchar = arr[i];
    }
  }
  m = 0;
}
console.log(arrchar + "(" + ta + ")");
-2
pomman 4 nov. 2019 à 12:12

4 réponses

Meilleure réponse

Le but d'avoir une boucle while est d'utiliser des conditions de sortie. Puisqu'il n'y a pas de condition de sortie, j'ai essentiellement créé un algorithme de boucle for assez efficace et je viens de remplacer la boucle for par une boucle while.

var arr = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3];

var occurences = {};

var max = 0;
var champion;

var index = 0;

while (index < arr.length) {
  var item = arr[index];
  occurences[item] = (occurences[item] || 0) + 1;
  if (occurences[item] > max) {
    max = occurences[item];
    champion = item;
  }
  index += 1;
}

console.log(`${champion} has ${max} occurences`);

Malheureusement, le code ci-dessus considérera toujours 3 et "3" comme la même valeur. Si vous ne souhaitez pas que cela se produise, utilisez plutôt une carte.

var arr = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3];

var occurences = new Map();

var max = 0;
var champion;

var index = 0;

while (index < arr.length) {
  var item = arr[index];
  var newSize = (occurences.get(item) || 0) + 1;
  occurences.set(item, newSize);
  if (newSize > max) {
    max = newSize;
    champion = item;
  }
  index += 1;
}

console.log(`${champion} has ${max} occurences`);
1
nick zoum 4 nov. 2019 à 09:38

Vous pouvez utiliser la méthode de filtrage avec la boucle while. Créez un tableau filtré pour chaque index arr. Si la longueur du tableau filtré est supérieure à maxOccurence, définissez la longueur du tableau filtré sur maxOccurence. Vous pouvez essayer une autre méthode de prototype de tableau. Il peut y avoir un moyen plus simple.

var arr = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3];

var char = "";
var maxOccurence = 0;
var i = 0;

while(i < arr.length){
  var filteredArr = arr.filter(x=> x === arr[i]);
  if(filteredArr.length > maxOccurence){
    char = arr[i];
    maxOccurence = filteredArr.length;
  }
  i++;
}
console.log(char + "(" + maxOccurence + ")");
0
Suhana Ramly 4 nov. 2019 à 09:36

Vous pouvez utiliser un réducteur de tableau:

const arr = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3];

let max, winner;

const arrReduce = arr.reduce((acc, curr, index) => {
  acc[curr] = acc[curr] ? acc[curr] += 1 : 1;
  if(max < acc[curr]) winner = curr
  max = max > acc[curr] ? max : acc[curr];
  return acc;
}, {});

console.log(max, winner)
0
David 4 nov. 2019 à 13:03

Exécutez le code suivant. Cela vous donnerait le résultat que vous attendiez le plus.

Const arr = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3];

// result array
var result = [];

$.each(arr, function( index, value ) {
    if(result[value] === undefined) 
        result[value] = 1;
    else
        result[value] = result[value] + 1;
});

console.log(result);
0
Kali SPM 4 nov. 2019 à 09:58