for文書きたくない。
タイトルにYUIとか書くと全く関係ないところが、キーワードを拾って、リンクを張ってきやがる。日本人にとって、YUIという言葉は、普通Yahoo! User Interfaceなんかではなく、人の名前になる。しかも、女性の可能性が高いので、リファラーがYUIだらけに。
というわけで、YUIを最近使っているわけだが、イテレートするのにfor文を書くのが嫌なので、eachとmapだけでも、prototype.jsから移植してみた。勝手に、YAHOO.util.Collectionと名前を付けてみたりw。改め、YAHOO.utilx.Collectionにした。また、使いそうなコレクションがあったら追加してみる予定。別に、anyやらallやら全部prototype.jsから持ってきてもいいのだけど、面倒なので必要があれば実装するし、使わなければ実装しない。
というわけで、以下がソース
-
YAHOO.namespace('utilx');
-
YAHOO.utilx.Collection = function() {
-
var _each = function(data, iterator) {
-
if (YAHOO.lang.isArray(data)) {
-
for (var i = 0, l = data.length; i <l; i++) {
-
iterator(data[i]);
-
}
-
} else if (data && typeof data === 'object') {
-
for (var property in data) {
-
iterator({key: property, value:data[property]});
-
}
-
}
-
};
-
return {
-
$break: {},
-
$continue: new Error('"throw $continue" is deprecated, use "return" instead'),
-
each: function(data, iterator) {
-
var index = 0;
-
try {
-
_each(data, function(value) {
-
iterator(value, index++);
-
});
-
} catch (e) {
-
if (e != this.$break) throw e;
-
}
-
return data;
-
},
-
map: function(data, iterator) {
-
var results;
-
this.each(data, function(value, index) {
-
var result = (iterator || function(v) { return v;})(value, index);
-
if (YAHOO.lang.isArray(data)) {
-
results = results || [];
-
results.push(result);
-
} else {
-
results = results || {};
-
if (result && result['key'] && result['value']) {
-
results[result['key']] = result['value'];
-
}
-
}
-
});
-
return results;
-
}
-
}
-
}();
次のように使う。配列のとき
-
var hogeArray = ["foo", "bar", "baz"];
-
YAHOO.utilx.Collection.each(hogeArray, function(data) {
-
console.log(data + "hogehoge")
-
});
-
hogeArray = YAHOO.utilx.Collection.map(hogeArray, function(data) {
-
if (data == 'baz') {
-
throw YAHOO.utilx.Collection.$break;
-
}
-
data = data + "hogehoge";
-
return data;
-
});
-
console.log(hogeArray);
オブジェクトのとき
-
var hogeObj = {"foo": "This is Foo", "bar": "This is Bar", "baz": "This is Baz"};
-
YAHOO.utilx.Collection.each(hogeObj, function(data) {
-
console.log(data.value + "hogehoge")
-
});
-
hogeObj = YAHOO.utilx.Collection.map(hogeObj, function(data) {
-
if (data.key == 'baz') {
-
throw YAHOO.utilx.Collection.$break;
-
}
-
data.value = data.value + "hogehoge";
-
return data;
-
});
-
console.log(hogeObj);
とりあえず、for文を書きたくないので、これで少しすっきりした。
よくよく考えれば、このような何度も使う可能性のあるメソッド等はprototypeオブジェクトに持たせるのがいいような気がしてきた。prototypeオブジェクトは、このために使うのが良さそうだな。それから、YAHOO.util改め、YAHOO.utilxにした。さすがにutilのnamespaceを汚すのは良くないからね。

