2018年12月16日日曜日

JavaScriptでPythonのrange関数っぽいものを作る

JavaScriptで連続した適当な配列を作りたい場合

const arr = [1, 2, 3, 4, 5];
でもいいですがPythonの様なrange関数でささっと作りたい場合があります。
Rangeオブジェクトは存在しますが、DOM用のオブジェクトでありPythonのものとは用途が違います。
underscore.jsで同じようなものが提供されているのでライブラリを使用するならそれがいいでしょう。

Pythonのrange関数

Pythonのrange関数はリスト(JavaScriptで言う配列)を容易に作れる関数です。
Pythonを使う方ならお馴染みでしょう。

主な仕様は、

range(0からの終了数)
range(開始数, 終了数)
range(開始数, 終了数, STEP数)

となります。引数の数によって動作が違います。


[ソース]

#! /usr/bin/env python

# -*- coding: utf-8 -*-

print("[range]")

for i in range(10):
    print(i, end=", ")
print()

for i in range(5, 10):
    print(i, end=", ")
print()

for i in range(0, 10, 2):
    print(i, end=", ")



[結果]

[range]
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
5, 6, 7, 8, 9,
0, 2, 4, 6, 8,

このような動作となります。
JavaScriptで同じような動作の関数を作ってみましょう。

ここあたり
https://dev.to/ycmjason/how-to-create-range-in-javascript-539i
を見ると、同じような考えでrange関数を作っている人がいます。

主な仕様は2番目のrange(開始数, 終了数)のようです。
Array.from() や Array.prototype.fill()を使った方法などがあるみたいです。
例にあるようなものに加え、STEP数まで加味出来る仕様にしましょう。


  function range(/* 開始数, 終了数, STEP数 */) {
    const len = arguments.length;
    const arr = [];
    let min = 0;
    let max = 0;
    let step = 1;

//引数の数により開始数と終了数を変える
    switch(len) {
      case 1:
        max = arguments[0];
      break;
      case 2:
        min = arguments[0];
        max = arguments[1];
      break;
      case 3:
        min = arguments[0];
        max = arguments[1];
        step = arguments[2];
      break;
    };

    for(let i = min; i < max; i++) {
// 第三引数があればSTEP数として処理をする
      if(step != 1) {
        if(i % step == 0) {
          arr.push(i);
        }
      }else {
        arr.push(i);
      }
    }

    return arr;
   }


//①
   const a1 = range(10);
   console.log(a1);


//②
   const a2 = range(5, 10);
   console.log(a2);


//③
   const a3 = range(1, 10, 2);
   console.log(a3);

//④
   for(let i of range2(5, 10)) {
      console.log(i);
   }


[結果]

[0,1,2,3,4,5,6,7,8,9]
[5,6,7,8,9]
[2,4,6,8]
5
6
7
8
9

レガシーな書き方ですが、こんな感じでしょうか?
④はPythonのrangeの様な使い方です。

Pythonで地図空間データを扱う⑤

ベースの地図が出来た所で、他のデータを被せてみます。 国土地理院の  500mメッシュ別将来推計人口データ  を使用します。 同じく神奈川県のデータ  500m_mesh_suikei_2018_shape_14.zip をダウンロードします。 ベースの地図データと同じ場所に展開...