実際の再帰の例はそれほど多くありません。私は今日1つを見つけたと思うし、それを共有したいと思うQ &私はそれが魅力的だと思うので、スタイル。再帰によって条件を満たす多次元配列の最後の要素を見つける
私はゲームのためにPhaserエンジンを使用しています。ユーザーがクリックすると、ユーザーがクリックしたゲーム要素を見つける必要があります。これは、複数の要素が重ね合わされると複雑になります。次に、レンダリングの順序を確認し、最も高い要素を選択する必要があります。
Phaserでは、すべての表示オブジェクトのルートは「世界」です。既存の要素はすべて、世界の直接的な子どもであるか、または子供の子供である。それはゲームの世界が上にある分岐構造です。子は、レンダリング順に並べられます。つまり、最後のものが上に表示されます。
var world = [
[
18,
3,
[
1,
14,
2
],
5,
9,
[
3,
5
]
],
[
16,
7
]
];
二つの主な「グループ」とこの配列の三つのレベルがあります。ここ
番号で表される各表示オブジェクトを有する、この例です。ゲームの言葉では、2番目のグループは最初のグループの後に追加されるため、上に表示されます。最初のグループの中で、最後の要素がグループの上にレンダリングされます。そのグループの中で、最後の要素がもう一度上にレンダリングされます。これらの要素のうち、一番上にレンダリングされた要素は、最後の要素なので7
です。
マウスをクリックすると、10より大きい数字(18
、14
、16
)で表されるすべての要素の上に表示されます。私が必要とするのは16
なので、一番遠いです。
どうすれば入手できますか?
- 'Array.forEachを()'使用する利点は何ですか?私がそれを使用する場合は、現在のオブジェクトが配列であるかどうかをチェックして、それを数値で呼び出すのを避ける必要もあります。 forループを使用すると、数値をループさせようとすると、その長さは定義されず、ループは実行されません。 'length'があれば問題になるかもしれないが、実際は配列ではないと思う。 2番目のスニペットについて - それはどのように動作するのか少し説明できますか?私は以前に 'reduce()'を見たことがなく、何が起こるか把握するのに苦労しています。私はコードが好きです。 –
関数を呼び出す前にサニティチェックを追加したり、適切な型が指定されていない場合は返されます。 'reduce'は配列を反復し、コールバックをとり、オプションとして開始値をとります。与えられたまたは最後の値と実際の値に新しい値の基数を戻します。この場合、コールバックは比較関数 'greaterThan10'をとり、returnのコールバックとして関数' iter'を返します。関数の内部では、配列をチェックし、reduce値またはchecked値のいずれかを返します。削減のもう一つの理由は、表現のようなクールな文章を書くことができます。 –
なぜ 'forEach'であるのかということは、結果を保持するための外部変数を使ったちょうど従来のアプローチです。 –