it-swarm.com.de

Wie gibt man ein Objekt in JavaScript aus einem Array zurück?

Erstellen Sie eine Funktion, die ein Array von Personenobjekten übernimmt und das erste gefundene Astronautenobjekt aus dem Array zurückgibt.

Dies ist der Code, den ich erstellt habe;

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]
        }
    }

Mein Code wird gegen diesen Test ausgeführt.

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
    });
  });
});

Wie kann ich meinen Code korrigieren?

9
Georgia Lumley

Sie müssen den Index für das Array verwenden.

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

Dann müssen Sie nur noch prüfen, ob isAstronauttrue ist und mit dem Artikel zurückkehren. 

Am Ende außerhalb der for-Schleife geben Sie null für einen nicht gefundenen Astronauten zurück.

Wenn Sie in der Schleife nachschauen, kehren Sie mit dem falschen Ergebnis zu früh zurück.

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

ES6 führt einen neuen Weg ein, um dies zu erreichen, wenn ES6 eine Option für Sie ist:

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

Oder noch abgekürzt:

myArray.find(item => item.isAstronaut)

find() ist einer der neuen Iteratoren, zusammen mit filter() und map() und anderen, um das Arbeiten mit Arrays zu erleichtern. find() gibt das erste Element in Ihrem Array zurück, das der Bedingung entspricht. Die =>- oder "arrow-Funktion" bedeutet, dass Sie die return-Anweisung nicht explizit einschließen müssen.

Lesen Sie mehr über ES6-Iteratoren .

6
Toby

Einzeiler

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

Sie können einfach Arrayelemente herausfiltern, deren isAstronaut-Eigenschaft gleich false ist, indem Sie Array.prototype.filter verwenden. Ich ziehe filter dem Array.prototype.find vor, da ES6 nicht in jedem Browser unterstützt wird. 

Sobald Sie das gefilterte Array haben, nehmen Sie einfach das Element in die Indexposition 0. Etwas wie unten:

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.

Zuerst müssen Sie möglicherweise prüfen, ob sich ein Element im Array befindet, oder den Wert null zurückgeben.

Zweitens müssen Sie nach der Eigenschaft suchen

Drittens müssen Sie prüfen, ob der Wert der EigenschaftAstronaut lautet

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