Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

JavaScriptのランプ関数いろいろ

More than 5 years have passed since last update.

ランプ関数とは

ランプ関数(Ramp function)とは、正(非負)の数を入力したときはそのままの数、
負の数が入力されたときはは0を返す関数です。

ランプ関数 - Wikipedia

似たような関数でクランプ(clamp)関数というのがありますが、
こちらの方が実用的だからか、あるいはランプ関数の方が吟味するほど味のある関数ではないからか、クランプ関数の方がよく目にする気がします。

Clamping (graphics) - Wikipedia, the free encyclopedia

実装例

条件分岐による方法

function ramp(x) {
  return (x < 0) ? 0 : x;
}

負の数だったら0、そうじゃなかったら入力値を返すという、定義に忠実な実装です。

max関数を使う方法

function ramp(x) {
  return Math.max(x, 0);
}

ちょっと数学的なやり方です(これも定義通り)。
引数を参照する部分が1つだけというのも良い点です。

符号関数を使う方法

function ramp(x) {
  return ((Math.sign(x) + 1) / 2) * x;
}

(Math.sign(x) + 1) / 2はステップ関数を表します。
ステップ関数がJavaScriptに組み込まれてないので、若干回りくどいです。
あと、もうちょっと工夫しないと、負の数でマイナスゼロが返ってきてしまいます。

文字列処理による方法

function ramp(x) {
  return Number(x.toString().replace(/^-.+/, 0));
}

正規表現でマイナスが付いているときだけ0に置換します。
入出力が両方文字列だった場合、x.replace(/^-.+/, '0')だけで済むので、その場合一番パフォーマンスがいいと思われます。

結論

直感ではありますが、一般用途ではmax関数を使う方法が一番素直でよいのではないでしょうか。

function ramp(x) {
  return Math.max(x, 0);
}
butchi_y
博士(工学)のフロントエンドエンジニアです。 ローレベルな言語仕様から、アニメーション演出まで幅広く興味を持ってます。 得意な言語はMathematica、JavaScript、ActionScriptです。 CGや音楽にもそれなりに詳しいです。
http://butchi.jp
kayac
古都鎌倉から新しい技術と面白いサービスを、次々にリリースする面白法人カヤックのフロントエンジニアチーム
http://www.kayac.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away