NRKNの資産評価額照会を一括ダウンロードするスクリプト@chrome

var downloadAsTextFile = function(fileName, content) {
    var a = document.createElement('a');
    a.download = fileName;
    a.href = (window.URL || window.webkitURL).createObjectURL(new Blob([new Uint8Array([0xEF, 0xBB, 0xBF]), content]));
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
};

var downloadAsCSVFile = function(fileName, rows) {
  var content = "";
  for(var i in rows) {
    for (var j = 0, m = rows[i].length; j < m; ++j) content += '"' + ("" + rows[i][j]).replace(/"/g, '""') + '"' + (j !== m ? ',' : '');
    content += '\n';
  }
  downloadAsTextFile(fileName, content);
};

var Queue = function() {
  this.promise = Promise.resolve(true);
  this.addAsync = (action) => this.promise = this.promise.then(() => new Promise((resolve) => action(resolve)));
  this.addSync  = (action) => this.addAsync((resolve) => { action(); resolve(); });
  this.delay    = (delay)  => this.addAsync((resolve) => setTimeout(resolve, delay));
};

var q = new Queue();

var header = [
  "照会対象年月日",
  "商品名",
  "商品分類",
  "数量(残高)",
  "基準価額",
  "資産評価額",
  "取得価額累計",
  "解約価額",
  "解約時評価額",
  "損益",
  "基準日",
  "資産比率",
];

var table = [];
table.push(header);

$("input[value='照会']").closest("form").find("select option").each((i, e) => {
  q.addAsync((resolve) => {
    console.log(e.innerHTML);
    $("input[value='照会']").closest("form").find("select").val(e.value);
    
    $.ajax({
      type: "POST",
      url:  "/webapp/nrk/W37S1210_AssetValueSearch.do",
      data: $("input[value='照会']").closest("form").serializeArray()
    }).done((r) => {
      var date = $("p.redTxt.bold", r).text().split(/ /)[1];
      
      $(".infoDetailUnit_02", r).each((i, e) => {
        var data = $("dd", e).map((i, dd) => [[
            $("dt", e).get(i).innerText.trim(), 
            dd.innerText.trim().replace(/円$/, "").replace(/▲/, "-")
          ]]).toArray().reduce((l, [k, v]) => Object.assign(l, { [k]: v} ), {});
        data["照会対象年月日"] = $("p.redTxt.bold", r).text().split(/ /)[1];
        table.push(header.map((k) => data[k]));
      });
      resolve();
    });
  })
});

q.addSync(() => downloadAsCSVFile("table.csv", table));

もうチョイスマートに書けないかな。。。