WSH/JScriptで配列の便利メソッドライブラリの案・少しアップデート

reduceを使ってmapやfilterを書き直し。

lib_arr.js

/*

	WSHやピュアJSの便利配列メソッド

	ver0.2 mapとfilterをreduceで記述
*/


// 配列のイテレータ
Array.prototype.each = function( func ){
	for( var i = 0; i < this.length; i ++ ){
		func.call( this, this[i], i ); 
	}
	return this; // チェインを継続
};


// Rubyのinjectに相当するメソッド
// http://d.hatena.ne.jp/TipsMemo+computer-technology/20150110/p1
Array.prototype.reduce = function( func, init_value ){
	// 初期値をセット
	var result = init_value;
	
	// 各要素ごとに
	this.each(function( item, index ){
		// 結果を累積更新する
		result = func( result, item, index );
	});
	
	// 累積結果を返す
	return result;
};


// オブジェクトを配列に変換
Array.src = function( iterable, func_item, func_length ){
	var arr = [];
	
	var length = null;
	if( func_length ){
		length = func_length( iterable );
	}else{
		iterable.length;
	}
	
	for( var i = 0; i < length; i ++ ){
		if( func_item ){
			arr.push( func_item( iterable, i ) );
		}else{
			arr.push( iterable[ i ] );
		}
	}
	return arr;
};


// -------------- 内部でreduceを使った処理 ---------------


// map
Array.prototype.map = function( func ){
	return this.reduce(function( result, item, index ){
		result.push( func.apply( result, [ item, index ] ) );
		return result;
	}, []);
};


// 多次元配列を1次元にならす関数。
// 内部でreduceを使用
Array.prototype.flatten = function(){
	return this.reduce(
		function( result, item ){
			return (
				//Array.isArray( item ) // WSHや古いIEでは動かない
				( item instanceof Array )
					// 対象要素が配列ならば,再帰する
					? result.concat( item.flatten() ) 

					// 対象要素が配列でなければ,要素として採用
					: result.concat( item )
			);
		},

		// 空配列からはじめる
		[]
	);
};


// 条件に合うものだけ残す
Array.prototype.filter = function( func ){
	return this.reduce(
		function( result, item ){
			if( func( item ) ){
				result.push( item );
			}
			
			return result;
		},
		[]
	);
};



// TODO: 配列データを手軽にダンプして中身を確認したい

// TODO: Haskellなどの便利メソッドの移植

// TODO: 重いループの非同期処理をするライブラリとマージ

// TODO: 二次元配列や動的計画法などのアルゴリズムをサポート


このライブラリを「非同期で重い処理をするライブラリ」にマージしようかどうか。

どちらも配列やループ処理に関わるからね。

一般テキストからテンプレートマッチングで項目を一覧表形式で抽出するJSコード (パターンの繰り返しから正規表現で連続キャプチャ) - ソフトウェア勉強ログとサンプルコード
http://source-code-student.hatenablog.jp/entry/20150102/p2

  • 工夫した点: 配列のeachがすごく重くなるので,jQueryのDeffered/Promiseパターンを参考に,自前でコールバックチェインの非同期化を実装した。