J'essaie d'écrire une fonction qui trouve les deux plus grandes valeurs dans un tableau de nombres et les stocke dans un nouveau tableau. Je ne parviens pas à supprimer le premier plus grand nombre du tableau d'origine, puis à trouver le deuxième plus grand.

Voici mon code:

function choseBig (myArray) {
    //var myArray = str.split(" "); 
    var result = [];
    var firstBig;
    var secondBig;
        // select the biggest value
        firstBig = Math.max.apply(Math, myArray);
        // find its index
        var index = myArray.indexOf(firstBig);
        // remove the biggest value from the original array 
        var myArray_2 = myArray.slice((index -1), 1);
        // choose the second biggest value
        secondBig = Math.max.apply(Math, myArray_2);
        // push the results into a new array
        result.push(firstBig, secondBig);

    return result;
}

console.log(choseBig ([1,2,3,4,5,9]));  
1
zamzam 5 mars 2016 à 21:48

7 réponses

Pourquoi ne pas simplement le trier (ordre décroissant) et prendre les deux premières entrées

biggest = myArray.sort(function(a,b){return b - a}).slice(0,2);
1
Suever 5 mars 2016 à 18:54

Les réponses ci-dessus sont probablement meilleures et plus compactes, mais au cas où vous ne voudriez pas utiliser sort() c'est une autre option

function choseBig (myArray) {

    var result = [], firstBig, secondBig;

    // select the biggest value
    firstBig = Math.max.apply(Math, myArray);

    // find its index
    var index = myArray.indexOf(firstBig);

    // remove the biggest value from the original array 
    myArray.splice((index), 1);


    secondBig = Math.max.apply(Math, myArray);

    // push the results into a new array
    result.push(firstBig, secondBig);

    return result;
}

console.log(choseBig ([1,2,3,4,5,9]));
1
fbid 5 mars 2016 à 18:57

Une solution linéaire avec Array#reduce sans tri.

var array = [1, 2, 3, 4, 5, 9],
    biggest = array.reduce(function (r, a) {
        if (a > r[1]) {
            return [r[1], a];
        }
        if (a > r[0]) {
            return [a, r[1]];
        }
        return r;
    }, [-Number.MAX_VALUE, -Number.MAX_VALUE]);

document.write('<pre>' + JSON.stringify(biggest, 0, 4) + '</pre>');

Modifier: plus d'une plus grande valeur

var array = [1, 2, 3, 4, 5, 9, 9],
    biggest = array.reduce(function (r, a) {
        if (a > r[1]) {
            return [r[1], a];
        }
        if (a > r[0]) {
            return [a, r[1]];
        }
        return r;
    }, [-Number.MAX_VALUE, -Number.MAX_VALUE]);

document.write('<pre>' + JSON.stringify(biggest, 0, 4) + '</pre>');
1
Nina Scholz 6 mars 2016 à 09:04

J'aime la solution linéaire de Nina Scholz. Et voici une autre version.

function chooseBig (myArray) {
   var a = myArray[0], b = myArray[0];
   for(i = 1; i < myArray.length; i++) {
       if (myArray[i] === a) {
           continue;
       } else if (myArray[i] > a) {
           b = a;
           a = myArray[i];
       } else if (myArray[i] > b || a === b) {
           b= myArray[i];
       }
   }
   return [a, b];
}
0
Community 23 mai 2017 à 11:53

Avec Math#max et Array#splice

var first = Math.max(...arr)
arr.splice(arr.indexOf(first))
var second = Math.max(...arr)

Et avec ES6 spread operator

0
isvforall 5 mars 2016 à 19:13
[1,101,22,202].sort(function(a, b){return b-a})[0]
[1,101,22,202].sort(function(a, b){return b-a})[1]
-2
Roshni Bokade 5 mars 2016 à 19:05

Si vous souhaitez récupérer les deux plus grandes valeurs d'un tableau numérique de manière non destructive (par exemple, ne pas modifier le tableau d'origine) et que vous souhaitez le rendre extensible afin de pouvoir demander le N le plus grand et les faire retourner dans l'ordre, vous pouvez le faire:

function getLargestN(array, n) {
    return array.slice(0).sort(function(a, b) {return b - a;}).slice(0, n);
}

Et, voici un extrait de travail avec quelques données de test:

function getLargestN(array, n) {
    return array.slice(0).sort(function(a, b) {return b - a;}).slice(0, n);
}

// run test data
var testData = [
    [5,1,2,3,4,9], 2,
    [1,101,22,202,33,303,44,404], 4,
    [9,8,7,6,5], 2
];

for (var i = 0; i < testData.length; i+=2) {
    if (i !== 0) {
        log('<hr style="width: 50%; margin-left: 0;">');
    }
    log("input: ", testData[i], " :", testData[i+1]);
    log("output: ", getLargestN(testData[i], testData[i+1]));
}
<script src="http://files.the-friend-family.com/log.js"></script>
0
jfriend00 8 mars 2017 à 16:15