開発環境
- OS X El Capitan - Apple (OS)
- Emacs (Text Editor)
- JavaScript (プログラミング言語)
- kjs-array (JavaScript Library)
- Safari(Web browser)
- JavaScript 第6版 (David Flanagan(著)、村上 列(翻訳)、オライリージャパン)(参考書籍)
- JavaScriptリファレンス 第6版(David Flanagan(著)、木下 哲也(翻訳)、オライリージャパン)(参考書籍)
数値の配列をソートするとき、よく引数を渡し忘れて、文字列に変換されてアルファベット順に並べ替えてしまから、それを防ぐために。(その他、よく使う関数、メソッドとかも追加。)
prototype 経由でビルトインのメソッドを書き換えるけど、数値配列をアルファベット順で並べ替えることより、数値順に並べ替えることの方が多いから問題なさそう。それでも数値配列をアルファベット順で並べ替えたいときは、明示的に引数に関数を指定すれば可能。
配列のソートの都度、数値配列かチェックすることになるから、そのオーバーヘッドが気になるようになるかも。
コード(Emacs)
(function (scope) {
'use strict';
var numberOrder,
isNumsArray,
arraySort = Array.prototype.sort;
Array.prototype.shuffle = function () {
var shuffled = [],
len = this.length,
len0,
i;
for (len0 = len; len0 > 0; len0 -= 1) {
i = Math.floor(Math.random() * len0);
shuffled.push(this[i]);
this.splice(i, 1);
}
for (i = 0; i < len; i += 1) {
this[i] = shuffled[i];
}
};
Array.prototype.shuffled = function () {
var a = this.slice();
a.shuffle();
return a;
};
numberOrder = function (x, y) {
return x - y;
};
isNumsArray = function (ary) {
return ary.every(function (elem) {
return typeof elem === 'number';
});
};
Array.prototype.sort = function (orderFunc) {
if (orderFunc === undefined && isNumsArray(this)) {
arraySort.call(this, numberOrder);
} else {
arraySort.call(this, orderFunc);
}
};
Array.prototype.sorted = function (orderFunc) {
var a = this.slice();
a.sort(orderFunc);
return a;
};
Array.prototype.reversed = function () {
var a = this.slice();
a.reverse();
return a;
};
scope.range = function (start, end, step) {
var nums = [],
i;
if (step === 0) {
throw {
name: 'ValueError',
message: 'range() arg 3 must not be zero',
};
}
if (step === undefined) {
step = 1;
}
if (end === undefined) {
end = start;
start = 0;
}
if (step > 0) {
for (i = start; i < end; i += step) {
nums.push(i);
}
} else {
for (i = start; i > end; i += step) {
nums.push(i);
}
}
return nums;
};
}(this.window || global));
0 コメント:
コメントを投稿