layout: post title: "Unaryデコレータを使って、map(parseInt)を期待通りに返す" date: 2017-01-29 00:00:00 +0900 categories: JavaScript


今回はmap関数を利用した際にしばしば起きる問題についての対応を。

Imgur

上記のように、

{% highlight js %} ['1', '2', '3'].map(parseFloat)

[1, 2, 3]という配列を返しているのに対して、

{% highlight js %} ['1', '2', '3'].map(parseInt)

[1, NaN, Nan]という配列を返してしまいます。

これは、Array.prototype.map()は下記のような引数を取り、

また、parseIntが第二引数にradixをとる関数なので、
今回の場合、mapのコールバックで渡されるindexをradixとして、parseIntに渡しているために
paraseIntは数値に変換することができずNaNを返したわけです。

Unary

今回はUnary関数を作成して、['1', '2', '3'].map(parseInt)の返り値を[1, 2, 3]にするようにします。
Unary関数は関数の引数をひとつだけ取るように変更するためのデコレーターです。

{% highlight js %}

const unary = (fn) => fn.length === 1 ? fn : function (something) { return fn.call(this, something); }

{% endhighlight %}

Imgur

この関数を使うことで期待通りの配列が返ってきました。
直感的にかけるので、この書き方を気に入っています。

参考