JavaScript を使用して [1,2,3,[4,5, [6,7]]、[[[8]]]] のような配列を [1,2,3,4,5, 6, 7 、8] どうでしょうか?伝説の Array Flatten。
この種の問題に対処するには、通常、アルゴリズムに従ってプログラムをループさせる再帰が必要です。ある本には「再帰は強力なプログラミング手法である」と書かれていますが、それは JavaScript だけに属するものではありません。再帰は難しい場合もあれば、比較的単純な場合もあります (それでも一般的には比較的難しいです)。上記の問題に対処するには、再帰を使用する方が適しているはずです。ワーカーは以前にこれを実装しました。これは再帰的使用の簡単な例です:
フラット化: function(ac){
var array = [];
var group = this.arr;
if(ac) group =
for ( var i = 0; group.length; i ){
if(group[i] 配列のインスタンス){
array.concat(this. flatten(group[i])); >}else{
array = array.concat(group[i]);
}
}
配列を返す;
}
in if(group [i]instanceofArray )、関数自体を呼び出し、パラメータを渡すことで再帰を実行します。ちょうど Array.js をリファクタリングしていたときに、せっかくフレームワークなんだから抽象的なものをあまり使わないのはもったいないなと思ったんです。したがって、最初から呼び出すよりも、抽象化された静的関数を呼び出す方が良いでしょう。ここには for ループがあるので、それぞれが必要になることを意味します。結果? 4 つの言葉、実装は難しい。常に配列を作成し、最終的にこの新しい配列を返す必要があるため、それを調整するために新しい関数を抽出する必要があります。これでは本来の趣旨に反することになりませんか?
ネットで調べて最終的にプロトタイプに落ち着きました。彼の実装方法は、再帰的なインクリメントを処理する関数を抽象化し、この関数を使用して再帰を行うことです。どう言えばいいでしょうか?私が言いたいのは、これをフレームワークと呼ぶということです。以下は再帰を処理する関数です:
function inject(memo , iterator, context) {
this.each(function(value,index) {
memo = iterator.call(context, memo, value,index);
}); >return memo;
}
この flatten 関数の最終的な実装は次のようになります。このコードはとても美しいです:
function flatten() {
return this.inject([], function(array, value) {
if (Object.isArray( value))
return array.concat(value. flatten());
return array;
もちろん、for ループを処理するには別の抽象関数が必要です。これが each 関数です。ちなみに、この各関数を flatten で取り出し、jQuery がどのように実行するかを学び、もちろん、配列だけでなく純粋なオブジェクトを処理することもできます:
コードをコピー
コードは次のとおりです: each: function (callback, binding) { var isObject = arale.typeOf(this.obj) ) === 'オブジェクト',
i = 0,
key;
if (isObject) {
var obj = this.obj>for (obj のキー) {
if (callback.call(bind, key, obj[key]) === false) {
break;
}
}
} else {
var arr = this.obj;
if (Array.prototype.forEach) {
// ユーザーが false を返すと実行を継続します
// ネイティブのものは非常に恥ずかしいので、そのままにしておくべきです。それとも TODO としてマークしたままにしておきますか? < length && callback.call(bind , i, value) !== false; value = arr[ i]) {}
}
}
最近JavaScriptでよく遊んでいます。最近の記事とチームの内部ブログに投稿された記事を見てみました。それらはすべて JS で書かれています。恥ずかしい。大きな変化のようです。バランスを取る必要があります。