読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

map、filterなどを使う時の便利な関数(__noSuchMethod__)

javascript

Array#mapなどを使う時、配列の要素に対して要素のメソッドを適用したいことがよくあるけど、普通はこう書かなきゃいけない。

[1, 2, 3, 4, 5].map(function (n) { return n.toString() });

こう書きたい。

[1, 2, 3, 4, 5].map(expand.toString()); // expandが1, 2, 3, 4, 5に置換されるようなイメージ

下のようにすれば、単にメソッドを適用したい時にいちいち無名関数を書かなくてよくなる。

var expand = {
  __noSuchMethod__: function __noSuchMethod__(prop, args)
    function (parent) parent[prop].apply(parent, args)
};

"__defineGetter__ __defineSetter__ hasOwnProperty\
 isPrototypeOf __lookupGetter__ __lookupSetter__\
 __parent__ propertyIsEnumerable __proto__ toSource\
 toString toLocaleString unwatch valueOf watch".split(" ")
  .forEach(function (prop) {
    expand[prop] = function () expand.__noSuchMethod__(prop, arguments);
  });


var cookies = document.cookie.split(";").map(expand.split("="));
//[["name", "javascripter"], ["last", "1222896080467"], ["token", "4jfe8rn3nr0x"], ["expires", "Thu, 01 Jan 1970 00:00:00 GMT"]]

cookies.map(expand.join("=")).join(";");
// "name=javascripter;last=1222896080467;token=4jfe8rn3nr0x;expires=Thu, 01 Jan 1970 00:00:00 GMT"

function I(o) o;
Array.map(document.querySelectorAll("div"), expand.querySelector("a")).filter(I);
//[a, a, a, a.autopagerize_link javascript:void(0), a.autopagerize_link javascript:void(0), a]

便利。