フィルタ機能が何も返さないため、undefined
は実質的にfalse
です。つまり、リストから除外されます。 return
文は、forEach
コールバックからのみ返されます。
.forEach()
の代わりに.some()
を使用し、その前にreturn
ステートメントを入れてください。コールバックの少なくとも1つの呼び出しがtruthy値を返す場合
[{'id':1,name:'x1'},{'id':2,name:'x2'},{'id':3,name:'x3'}].filter(function(val){
return [1,2,3].some(function(id){
if(id == val.id){
return true;
}
});
});
.some()
方法はtrue
を返します。真理値が返されると直ちに反復を停止します。
FYI、あなたはif
ステートメントをドロップすることによって、それを少し短くすることができます。
[{'id':1,name:'x1'},{'id':2,name:'x2'},{'id':3,name:'x3'}].filter(function(val){
return [1,2,3].some(function(id){
return id == val.id
});
});
またはそれ以上の新しい矢印関数の構文を使用します。
[{'id':1,name:'x1'},{'id':2,name:'x2'},{'id':3,name:'x3'}]
.filter((val) => [1,2,3].some((id) => id == val.id));
それとも、比較を行うために、任意の複雑なロジックを必要としないので、あなたは、厳密な等価比較に基づいてブール結果を返すES7 .includes()
方法を、使用することができます。
[{'id':1,name:'x1'},{'id':2,name:'x2'},{'id':3,name:'x3'}]
.filter(function(val) { return [1,2,3].includes(val.id) });
または
[{'id':1,name:'x1'},{'id':2,name:'x2'},{'id':3,name:'x3'}]
.filter((val) => [1,2,3].includes(val.id));
まだ.indcludes()
を持っていない古い実装をアップパッチを適用するためにリンクされドキュメント内ポリフィルがあります。
@squint。私の間違いを今すぐ見つけた – MeanMan
これはよくある間違いですが、それはありません。そうした場合、呼び出しスタック内のすべての関数を停止するという副作用がありますが、通常は望ましくありません。 –