どうでもいいけど、C言語っぽく
let result = new Array(10);
for (let index = 0; index < 10; index++) {
result[index]= index + 1;
}
console.log(result);
// (10) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
では色々注意が必要。
から始まって・・・
let result = []
for (let index = 0; index < 10; index++) {
result.push(index + 1);
}
console.log(result);
// (10) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
この時点でまだindexをいっぱい書いてあるから
index + 1じゃなくて let index=1すれば良い!
とか余計な修正をしだすと
index < 10の部分を見落としてそう。
つまり、indexの出現は少ない方が良い。
しかし、
var result = [...Array(10)].map((_, i) => i+1)
console.log(result);
// (10) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
では作業用配列をいくつも作ってしまう。
Array(10)とか[…xxx]とかね。
とは云え
var result = Array.from({length: 10},(_, index) => index + 1);
console.log(result);
// (10) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
に至っては {length:10 } でObjectの振りというか {…}は紛れもなくObjectだけど、
length: 10とよくあるプロパティでArray.fromを騙すのはいいとして
indexが唐突に出てくる感じがするけど・・・
Array.from(arrayLike, mapFn)
Array.fromはこんなパラメータになっているので
Array.prototype.map((value, index) => { ... });
を思い浮かべば、理解してもらえそう。
それに無駄な作業用配列も作らないから
1から1万までの連番配列を作るには丁度良い。
気がする。
そこで
Array.from(arrayLike, mapFn, thisArg)
まで使ってみると
var result = Array.from({ length: 10 }, function (_, index) { return index + this.start; }, { start: 1 });
console.log(result);
// (10) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
明示的に連番の初期値を設定できて気持ちはすっきりするけど、
アロー関数にとってthisはwindowしかありえないので
無名functionにしないといけないし
スクロールバーが出るくらい長いので蛇足感がある。
だが、連番+αのテストデータを作るのには向いている気がするので次点とした。
結果は・・・
var result = Array.from({length: 10},(_, index) => index + 1);
が良さげ。
/**
* 連番作成
* @param {integer} start 開始番号
* @param {integer} end 終了番号
* @return {Array of object} 開始番号~終了番号の配列
*/
const range = (start, end) => {
let rc = Array.from({ length: (end - start + 1) }, (_, index) => index + start);
if (callbackMap) {
rc = rc.map(callbackMap);
}
return rc;
};
range().map(callback) をラップしてrangeMapを作ってみたが、使い心地は・・・
range(1, rows).map((nRow) => {
createTrElement(objTable, nRow, ...);
});
rangeMap(1, rows,(nRow) => {
createTrElement(objTable, nRow, ...);
});
見分けが付かないくらい同じだった。(笑
ps.
クエスチョン:spreadSheetのコードで上のrangeを使ってみると妙に重い(初期表示2秒前後)。何でだろう?
アンサー:今のEXCELって最大1048576行16384列なのでこの最大値に合わてみたら、初期表示で物凄い量の配列を作っていた!普通のfor文に戻すとサクっと初期表示。配列のままでも動かない訳では無いけど、時々Chromeやタスクバーがマウスに反応しなかった原因のような気がする。
100万×1.6万≒160億 だからなぁ~
でもfor文のままなのも、配列じゃなくても連番指定でsomeとmapっぽく動作すればいいから
/**
* 連番配列っぽいイテレータを作成する
* @param {integer} start 開始番号
* @param {integer} end 終了番号
* @returns {iterator} 開始番号から終了番号を格納した配列っぽいイテレータ
*/
const range = (start, end) => {
let step = 1
const rangeIterator = {
some: function (func) {//someっぽく動作させる
for (let cnt = start; cnt <= end; cnt += step) {
if (func(cnt)) {
return true;
}
}
return false;
},
map: function (func) {//mapっぽく動作させる
const f = false;//配列を返さない
let aRc;
if (f) {
aRc = new Array(end - start + 1);
}
let index = 0;
for (let cnt = start; cnt <= end; cnt += step) {
const rc = func(cnt);
if (aRc) aRc[index++] = rc;
}
return aRc;
},
};
return rangeIterator;
}