Javascript備忘録

#1. 一般テクニック
##1-1 他のファイルから定数を読み出す(module.exports)

const.jsに定義した定数を呼び出して使う。

ディレクトリ構成
 --const.js
 --test.js 


```javascript:/const.js
module.exports={
    DATLENGTH:200, //描写する対象の日数を設定する 
    MEIGARA_NAME:"NIKKEI225", //銘柄名を設定する。
    S_PERIOD:10, //移動平均短期
    M_PERIOD:20, //移動平均中期
    L_PERIOD:50 //移動平均長期
}
```

```javascript:/test.js
const consts = require('./const')
console.log(consts.DATELENGTH)  //200が表示される
}
```


##1-2 文字列を指定文字で区切り配列に格納する関数(stringToSplit)

```javascript:/test.js
//文字列を指定した文字で分割し、配列に格納する関数
function splitString (stringToSplit,separator) {
 var arrayOfStrings = stringToSplit.split(separator);
 //console.log('元の文字列: "' + stringToSplit + '"');
 //console.log('区切り: "' + separator + '"');
 //console.log("配列は " + arrayOfStrings.length + " 要素: ");
return arrayOfStrings;
}
```

##1-3 アロー関数

(1)通常の書き方

```javascript:/test.js
const double = function(number){
 return 2 * number
}
double(8);

```
(2)allow関数を使用

```javascript:/test.js
const double = (number) => {
 return 2 * number
}

double(8);
```
return行が一行なので、さらに簡略化する。

```javascript:/test.js
const double = (number) =>  2 * number

double(8);
```

引数が一つなので()を外す

```javascript:/test.js
const double = number =>  2 * number

double(8);
```


#2. 配列操作


##2-1 配列の一部分を取り出す(slice)

slice(x,y)   配列のx番目からy-1番目を抽出する

```javascript:/test.js
const result=[6,3,6,5,3,2]
console.log(result.slice(0,2))  // [6,3]

```

##2-2 map関数

map() メソッドは、与えられた関数を配列のすべての要素に対して呼び出し、その結果からなる新しい配列を生成します。

```javascript:/test.js
var array1 = [1, 4, 9, 16];

// pass a function to map
const map1 = array1.map(x => x * 2);

console.log(map1); // expected output: Array [2, 8, 18, 32]
```

##2-3 配列定義


```javascript:/test.js
   let val_box=Array(data.length); //data.lenghtの大きさの空の配列を用意する。
       val_box.fill("")  // すべての要素に""をセッティングする。
```

##2-4 push関数

```javascript:/test.js
  var bands=[];
    for (var i=0 ; i<data.length-1; i++ ){
      var temp=data.slice(i,i+2)
      let change_rate=(temp[1].close/temp[0].close -1)*100
      bands.push({ date: data[i+1].date,
                         val: change_rate
                                            });
    }
```


#3. 繰り返し操作

##3-1 forEach

```javascript:/test.js
var images = [
  { height: 10, width: 30 },
  { height: 20, width: 90 },
  { height: 54, width: 32 }
];
var areas = new Array(3);

images.forEach(function(image,k){
areas[k]=image.height*image.width  ;
 console.log('k:'+k)  // k:0 , k:1 , k:2
});
console.log(areas)   // [ 300, 1800, 1728 ]
```

#4. エラー処理

##4-1. Try-catch

```javascript:/test.js
try{
 
   //何らかの処理

}catch(e){
  console.log("エラーが発生しました！！！！！");
  console.log(e);
}
```

#5. ファイル操作

##5-1 ファイルへの書き込み & ファイルの削除

JSONデータを作りJSONファイルに書き込みを行う。

```javascript:/test.js
const JSONFILEPATH="/home/stock/stockdata.json"
const fs = require('fs')


//(1)まずは辞書型配列を作る。
  var obj={
    name: "Taro",
    age:30,
    address:"Japan"
  }

 //(2)JSON.stringfyを使い辞書型配列をJSON形式に変換する。
  var jsondat = JSON.stringify( obj );

 //(3)上記jsondatを書き込むファイルがすでに存在する場合は当該ファイルを一度削除する。
  if (fs.existsSync(JSONFILEPATH)) fs.unlinkSync(JSONFILEPATH)  

 //(4)jsondatをJSONFILEPATHに存在するファイルに書き込む
  fs.writeFileSync(JSONFILEPATH,jsondat) 
```

##5-2 テキストファイルの読み込み

テキストファイルを読み込むときは、fs.readFileSyncを使う。


```javascript:/test.js
const fs = require('fs')
const CSVPATH="/home/pi/test.text"

//ファイルの読み込みを行っている。
//fs.readFileSync  第1引数:読み取りたいファイルが配置されているパス、第2引数：文字コード設定
let csvobj_reg=fs.readFileSync(CSVPATH,'utf-8') //ファイルの読み込みを行っている。
```


#6. 非同期処理

#6-1 async,awiat

```javascript:/test.js

// value*2の計算を2秒後に実施する関数
function sampleResolve(value) {
    return new Promise(resolve => {
        setTimeout( () => {resolve(value * 2);}, 2000);
    })
}

/**
 * sampleResolve()をawaitしているため、Promiseの結果が返されるまで処理が一時停止される
 * 今回の場合、2秒後にresolve(10)が返ってきてその後の処理（return result + 5;）が再開される
 * resultにはresolveされた10が格納されているため、result + 5 = 15がreturnされる
 */
async function sample() {
    const result = await sampleResolve(5);
    return result + 5;
}

sample().then(result => {
    console.log(result); // => 15
});

```
上記ソースは以下
https://qiita.com/soarflat/items/1a9613e023200bbebcb3


#6-2 Request-Promise

```javascript:/test.js
const rp = require('request-promise')

//sendRequestは、外部APIよりデータを取得する非同期関数。Promiseを返す。
const sendRequest = (method, uri, body) => {
    const options = { method, uri, body, json: true }
     return rp(options)
       .then(  body => {
            console.log(body) //APIから返却された値を表示する。
            var jsondat = JSON.stringify( body ); //辞書型形式データをJSON形式データに変換する。
        if (fs.existsSync(JSONFILEPATH)) fs.unlinkSync(JSONFILEPATH)   //すでに同一ファイルが存在するときは一旦削除する。
        //テキストファイルに書き出しを行う。関数sendRequest内で取得したデータは変数のままでは関数外に持ち出せないので一旦テキストファイルに書き出しをする。
        fs.writeFileSync(JSONFILEPATH,jsondat)
    } )
       .catch( err => {
        switch(err.statusCode){
            case 404:
                // NOT FOUND Process
                break;
            default:
                // Other Error Process
                break;
            }
        })
}
```



#7. 三項演算子

```javascript:/test.js
function getFee(isMember) {
  return (isMember ? '$2.00' : '$10.00');
}
```

#8. 日付の操作

本日の日付(2020/4/16)と基準日(2020/4/14)の日付の差を計算する

```javascript:/test.js
var datediff=function (predat) {
      var d1 = new Date(predat); 日付predatを日付型に変更する。
  　  var today = new Date(new Date().getFullYear(),new Date().getMonth(),new Date().getDate(),0,0,0);  //本日の日付を取得している。
      console.log(today)
     var msDiff = d1.getTime() - today.getTime();
     var daysDiff = msDiff / (1000 * 60 * 60 *24);
     return daysDiff
}

predat='2020/04/14'
console.log(datediff(predat)) // -2が表示される

```

#9. JSON操作

#9-1 JSON.stringfy() , JSON.parse() 

・JSON.stringfy():配列をJSONデータに変換する。 
・JSON.parse():配列をJSONデータに変換する。 


```javascript:/test.js
jsondat=JSON.stringify({ x: 5, y: 6 }) //配列 -> JSONデータへ変換
console.log(jsondat)  //{"x":5,"y":6}

dat=JSON.parse(jsondat) //JSONデータ -> 配列へ変換
console.log(dat)  //{ x: 5, y: 6 }
```
#10. データ型を調べる

#10-1 数値型かどうか
https://uxmilk.jp/46961