Array.forEachでbreakは使えないんじゃよの巻
配列を上から順に見て、一番最初に見つかった男性キャラの名前を表示したいとします
let characters = [
{
name: "阿良々木暦",
gender: "male"
},
{
name: "戦場ヶ原ひたぎ",
gender: "female"
},
{
name: "八九寺真宵",
gender: "female"
},
{
name: "神原駿河",
gender: "female"
},
{
name: "千石撫子",
gender: "female"
},
{
name: "羽川翼",
gender: "female"
},
{
name: "忍野メメ",
gender: "male"
},
{
name: "忍野忍",
gender: "female"
}
];
// Uncaught SyntaxError: Illegal break statement
characters.forEach(function(character){
if(character["gender"] === "male"){
console.log(character["name"]);
break;
}
});
予期した結果としては「阿良々木暦」と表示されるはずですが、
「Uncaught SyntaxError: Illegal break statement」と怒られます。
C#のforeach等と同じ感覚では使えないわけです。
ここでforEachを__some__、breakを__return true__に置き換えます。
// 「阿良々木暦」と表示される
characters.some(function(character){
if(character["gender"] === "male"){
console.log(character["name"]);
return true;
}
});
これで期待した動作をします!簡単ですね!
本来のArray.someの使い方
実は先ほどのコードでは、someメソッド自体もtrueを返しています。
これはArray.someが__第一引数に与えられた関数がtrueを返すまでループを回す__メソッドであるからです。
配列の最後の要素まで行ってtrueが返らなかった場合にのみArray.someはfalseを返します。
なので、本来の使い方としてはこんなところではないでしょうか。
// 忍ちゃんがいたらドーナツを買う
function shouldBuyDonut(characters){
return characters.some(function(character){
return character["name"] === "忍野忍";
});
}