人物オブジェクトの配列を受け取り、その配列から最初に見つかった宇宙飛行士オブジェクトを返す関数を作成します。
これは私が作成したコードです。
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
});
});
});
コードを修正するにはどうすればよいですか?
配列のインデックスを使用する必要があります。
people[i] // for the object people[i].isAstronaut // for a property of the object
次に、isAstronaut
がtrue
であるかどうかを確認し、アイテムとともに戻ります。
for
ループの外側で、宇宙飛行士が見つからない場合はnull
を返します。
ループの内側をチェックすると、間違った結果で早く戻ります。
function findFirstAstronaut(people) {
for (let i = 0; i < people.length; i++) {
if (people[i].isAstronaut) {
return people[i];
}
}
return null;
}
ES6がオプションの場合、ES6はこれを実現する新しい方法を導入します。
_myArray.find(item => {
return item.isAstronaut
})
_
またはさらに短縮:
_myArray.find(item => item.isAstronaut)
_
find()
は新しい反復子の1つであり、filter()
およびmap()
およびその他の配列の操作を容易にするためのものです。 find()
は、条件に一致する配列の最初の項目を返します。 _=>
_または「矢印関数」は、returnステートメントを明示的に含める必要がないことを意味します。
一発ギャグ
arr.filter(item => item.isAstronaut)[0]
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);
最初に、配列にアイテムがあるかどうかを確認するか、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;
}