web-dev-qa-db-ja.com

JavaScriptで配列からオブジェクトを返す方法

人物オブジェクトの配列を受け取り、その配列から最初に見つかった宇宙飛行士オブジェクトを返す関数を作成します。

これは私が作成したコードです。

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

私のコードはこのテストに対して実行されます。

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

コードを修正するにはどうすればよいですか?

10
Geo

配列のインデックスを使用する必要があります。

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

次に、isAstronauttrueであるかどうかを確認し、アイテムとともに戻ります。

forループの外側で、宇宙飛行士が見つからない場合はnullを返します。

ループの内側をチェックすると、間違った結果で早く戻ります。

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

ES6がオプションの場合、ES6はこれを実現する新しい方法を導入します。

_myArray.find(item => {
  return item.isAstronaut
})
_

またはさらに短縮:

_myArray.find(item => item.isAstronaut)
_

find()は新しい反復子の1つであり、filter()およびmap()およびその他の配列の操作を容易にするためのものです。 find()は、条件に一致する配列の最初の項目を返します。 _=>_または「矢印関数」は、returnステートメントを明示的に含める必要がないことを意味します。

ES6イテレータについての詳細を読む

6
Toby

一発ギャグ

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

Array.prototype.filterを使用して、isAstronautプロパティがfalseに等しい配列要素を単純に除外できます。 ES6はすべてのブラウザーでサポートされているわけではないため、Array.prototype.findよりfilterの方が好きです。

フィルターされた配列を取得したら、0インデックス位置にある要素を取得します。以下のようなもの:

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.

最初に、配列にアイテムがあるかどうかを確認するか、nullを返す必要があります。

第二に、プロパティを確認する必要があります

第三に、プロパティ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