prototype.js分析 Enumerable

sortBy() 基準に沿ってソートする

<script>
Array.prototype._each = function(iterator){
	for(var i=0, l=this.length; i<l; i++){
		iterator(this[i]);
	}
};

Array.prototype.each = function(iterator){
	var index = 0;
	try{
		this._each(function(v){
			iterator(v, index++);
		});
	} catch(e){
		if(e != $break) throw e;
	}
};

Array.prototype.collect = function(iterator){
	var rs = [];
	this.each(function(v, k){
		rs.push(iterator(v, k));
	});
	return rs;
};

Array.prototype.pluck = function(prop){
	var rs = [];
	this.each(function(v, k){
		rs.push(v[prop]);
	});
	return rs;
};

Array.prototype.sortBy = function(iterator){
	return this.collect(function(v, k){
		return {v: v, criteria: iterator(v, k)};
	}).sort(function(left, right){
		var a = left.criteria, b = right.criteria;
		return a < b ? -1 : a > b ? 1 : 0;
	}).pluck('v');
};

var $break = {};
var kekka = "aaaa,aaa,aa,a".split(',').sortBy(function(v, k){
	return v.length;
});
console.log(kekka);
</script>

補足

  • メソッドチェーンで混乱する、という場合は高橋 登史朗さんの記事がわかりやすいと思います。以下にそれを参考にした(というかまんま)コードを載せておきます。
  • オリジナルのprototype.jsではArray.prototype.each()には「return this;」がありますのでご注意を。
<script>
var Foo = {
	method_a : function(){
		console.log('a');
		return this;
	},
	method_b : function(){
		console.log('b');
		return this;
	}
}

Foo.method_a().method_b();
</script>