Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to return an object from an array in JavaScript [duplicate]

Create a function that takes an array of people objects and returns the first found astronaut object from the array.

This is the code that I have created;

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

My code is run against this 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
    });
  });
});

How do I fix my code?

like image 919
Geo Avatar asked Dec 24 '18 17:12

Geo


People also ask

Can array have duplicate values JavaScript?

To check if an array contains duplicates: Pass the array to the Set constructor and access the size property on the Set . Compare the size of the Set to the array's length. If the Set contains as many values as the array, then the array doesn't contain duplicates.


3 Answers

ES6 introduces a new way to achieve this, if ES6 is an option for you:

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

Or even more abbreviated:

myArray.find(item => item.isAstronaut)

find() is a one of the new iterators, along with filter() and map() and others for more easily working with arrays. find() will return the first item in your array that matches the condition. The => or "arrow function" means that you do not need to explicitly include the return statement.

Read more about ES6 iterators.

like image 120
Toby Avatar answered Oct 19 '22 03:10

Toby


You need to use the index for the array.

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

Then you need only a check if isAstronaut is true and return with the item.

At the end outside of the for loop, return null, for a not found astronaut.

If you check inside the loop, you will return too early with the wrong result.

function findFirstAstronaut(people) {
    for (let i = 0; i < people.length; i++) {
        if (people[i].isAstronaut) {
            return people[i];
        }
    }
    return null;
}
like image 31
Nina Scholz Avatar answered Oct 19 '22 02:10

Nina Scholz


One liner

arr.filter(item => item.isAstronaut)[0]
like image 5
ellipsis Avatar answered Oct 19 '22 02:10

ellipsis