web-dev-qa-db-fra.com

Comment retourner un objet d'un tableau en JavaScript

Créez une fonction qui prend un tableau d'objets de personnes et renvoie le premier objet astronaute trouvé dans le tableau.

C'est le code que j'ai créé;

function findFirstAstronaut(people) {
    for (let i = 0; i < people.length; i++) {
        if (people.astronaut[i] === false) {
            return null
        }
        else  if (people.astronaut[i]) {
            return people[i]
        }
    }

Mon code est exécuté contre ce test.

describe("findFirstAstronaut", () => {
  it("returns null if no Astronaut is in the array", () => {
    expect(findFirstAstronaut([])).to.be.null;
  });

  it("returns a person object who is an astronaut", () => {
    const astronaut = { name: "Tim Peake", isAstronaut: true };
     expect(findFirstAstronaut([astronaut])).to.have.keys([
      "name",
      "isAstronaut"
    ]);
    expect(findFirstAstronaut([astronaut]).isAstronaut).to.be.true;
  });

  it("returns the first astronaut from the array", () => {
    const astronauts = [
      { name: "Johnny Karate", isAstronaut: false },
      { name: "Neil Armstrong", isAstronaut: true },
      { name: "Valentina Tereshkova", isAstronaut: true },
      { name: "Bert Macklin", isAstronaut: false },
      { name: "Eileen Collins", isAstronaut: true },
      { name: "Kip Hackman", isAstronaut: false }
    ];
    expect(findFirstAstronaut(astronauts)).to.eql({
      name: "Neil Armstrong",
      isAstronaut: true
    });
  });
});

Comment puis-je réparer mon code?

9
Georgia Lumley

Vous devez utiliser l'index pour le tableau.

people[i]                // for the object
people[i].isAstronaut    // for a property of the object

Il vous suffit ensuite de vérifier si isAstronaut est true et de le renvoyer avec l'élément. 

À la fin de la boucle for, retournez null pour un astronaute introuvable.

Si vous vérifiez à l'intérieur de la boucle, vous retournerez trop tôt avec un résultat erroné.

function findFirstAstronaut(people) {
    for (let i = 0; i < people.length; i++) {
        if (people[i].isAstronaut) {
            return people[i];
        }
    }
    return null;
}
3
Nina Scholz

ES6 introduit un nouveau moyen d'y parvenir, si ES6 est une option pour vous:

myArray.find(item => {
  return item.isAstronaut
})

Ou encore plus abrégé:

myArray.find(item => item.isAstronaut)

find() est l’un des nouveaux itérateurs, avec filter() et map() et d’autres pour travailler plus facilement avec des tableaux. find() retournera le premier élément de votre tableau qui correspond à la condition. => ou "fonction de flèche" signifie qu'il n'est pas nécessaire d'inclure explicitement l'instruction return.

En savoir plus sur les itérateurs ES6 .

6
Toby

Bon mot

arr.filter(item => item.isAstronaut)[0]
2
ellipsis

Vous pouvez simplement filtrer les éléments de tableau ayant une propriété isAstronaut égale à false à l'aide de Array.prototype.filter. Je préfère filter à Array.prototype.find car ES6 n'est pas pris en charge par tous les navigateurs. 

Une fois que vous avez le tableau filtré, prenez simplement l'élément à la position d'indexation 0. Quelque chose comme ci-dessous:

const astronauts = [{
    name: "Johnny Karate",
    isAstronaut: false
  },
  {
    name: "Neil Armstrong",
    isAstronaut: true
  },
  {
    name: "Valentina Tereshkova",
    isAstronaut: true
  },
  {
    name: "Bert Macklin",
    isAstronaut: false
  },
  {
    name: "Eileen Collins",
    isAstronaut: true
  },
  {
    name: "Kip Hackman",
    isAstronaut: false
  }
];

//Array destructuring to get the first astronaut:
var [firstAstronautFound] = astronauts.filter(el => el.isAstronaut);

//Line above is same as doing this:
//var firstAstronautFound = astronauts.filter(el => el.isAstronaut)[0];

console.log(firstAstronautFound.name);

0
Tom O.

Tout d’abord, vous devrez peut-être vérifier s’il existe un élément dans le tableau ou renvoyer null.

Deuxièmement, vous devez vérifier la propriété

Troisièmement, vous devez vérifier la valeur de la propriété isAstronaut

function findFirstAstronaut(people) {
   if (people.length > 0)
    {
      for (let i = 0; i < people.length; i++) {
         if (("name" in people[i]) && ("isAstronaut" in people[i])) {
           if (people[i].isAstronaut)
              return people[i];              
           else  
              return true;
       }
      }
     }
    else
      return null;
   }
0
Sonal Borkar