Imaginez que j'ai le tableau d'objets suivant :

 const object = [
  {Name: "A", Nr: "01"},
  {Name: "B", Nr: "02"},
  {Name: "C", Nr: "04"},
  {Name: "D", Nr: "06"},
  {Name: "E", Nr: "07"},
 ];

Et j'ai la fonction suivante:

const findCurrentNumber = (obj) => {
    let numbers = obj.map((a) => {
      return parseInt(a["Nr"]);
    });

    numbers.sort((a, b) => a - b);
    let current = numbers[numbers.length - 1];
    for (let i = numbers.length - 1; i > 0; i--) {
      if (numbers[i - 1] !== numbers[i] - 1) current = numbers[i - 1];
    }

    return current + 1;
  };

J'obtiendrai la valeur 3 en retour. Mais je veux faire la même chose en utilisant simplement des méthodes de tableau (map, tri, reduce, etc.). J'essayais et je me suis arrêté ici :

const obj = object.map(a => parseInt(a["Nr"])).sort((a, b) => a - b);

Je ne sais pas comment continuer à partir de la partie que j'ai déclarée la variable current.

Est-il possible? Si oui, comment puis-je le faire ?

Je vous remercie!

1
Polalas 12 nov. 2020 à 18:09

1 réponse

Meilleure réponse

Vous pouvez adopter une approche pour Comment écrire le code avec moins de complexité temporelle pour trouver l'élément manquant dans une plage de tableau donnée ? et prendre les valeurs numériques de Nr.

function getMissing(array) {
    var min = array[0],
        max = array[0],
        missing = new Set;
    
    array.forEach(v => {
        if (missing.delete(v)) return;                   // if value found for delete return
        if (v < min) while (v < --min) missing.add(min); // add missing min values
        if (v > max) while (v > ++max) missing.add(max); // add missing max values
    });
    return missing.values().next().value;                // take the first missing value
}

const
    data = [{ Name: "A", Nr: "01" }, { Name: "B", Nr: "02" }, { Name: "C", Nr: "04" }, { Name: "D", Nr: "06" }, { Name: "E", Nr: "07" }],
    first = getMissing(data.map(({ Nr }) => +Nr));

console.log(first);

Approche classique. En vérifiant un tableau ordonné de nombres et en obtenant celui où la valeur suivante a un delta de plus d'un. Ajoutez enfin un pour le numéro manquant.

const
    data = [{ Name: "A", Nr: "01" }, { Name: "B", Nr: "02" }, { Name: "C", Nr: "04" }, { Name: "D", Nr: "06" }, { Name: "E", Nr: "07" }],
    first = 1 + data
        .map(({ Nr }) => +Nr)
        .sort((a, b) => a - b)
        .find((l, i, { [i + 1]: r = Number.MAX_VALUE }) => r >= l + 2);

console.log(first);
1
Nina Scholz 12 nov. 2020 à 16:49