LoginSignup
21
28

More than 5 years have passed since last update.

argumentsオブジェクトを配列(Array)にする方法

Posted at

今更ですがargumentsオブジェクトを配列(Array)にする方法をいくつかあげてみた。

:large_blue_circle:黒魔術系: argumentsオブジェクトそのもののクラスをObjectからArrayに変更する

配列(Array)の様にargumentsを扱えるようにする。非常に危険なので注意。

Object.setPrototypeOf(arguments, Array.prototype);
// または
arguments.__proto__ = Array.prototype;
function sortArgs() {
    Object.setPrototypeOf(arguments, Array.prototype);
    return arguments.sort().join(',');
}

console.log(sortArgs(1, 3, 5, 2, 4, 6));

実はArray-likeなオブジェクトになっているだけなので、そのまま使用しないように。
というか、実際のプロジェクトには使っちゃいけない。
あまり速くもないし。

:large_blue_circle:forを使ってargumentsを配列にコピーする

普通。args = []よりargs = new Array(n)がいいかも。

var args = [];
for (var i = 0; i < arguments.length; ++i)
  args[i] = arguments[i];
function sortArgs() {
    var args = new Array(arguments.length);
    for (var i = 0; i < arguments.length; ++i)
        args[i] = arguments[i];
    return args.sort().join(',');
}

console.log(sortArgs(1, 3, 5, 2, 4, 6));

:large_blue_circle:sliceを呼んでArrayに変換する

sliceを呼んで配列にする。これは非常によく見かける方法。

var args = [].slice.call(arguments);
// または
var args = Array.prototype.slice.call(arguments);
function sortArgs() {
    return [].slice.call(arguments).sort().join(',');
}

console.log(sortArgs(1, 3, 5, 2, 4, 6));

:large_blue_circle:...argsでArrayとして引数を得る

ES6 (ES2015) 以降ならこの方法が一番いいと思う。

(...args)
function sortArgs(...args) {
    return args.sort().join(',');
}

console.log(sortArgs(1, 3, 5, 2, 4, 6));

似てるけど他に以下の方法もある。

function sortArgs() {
    return [...arguments].sort().join(',');
}

console.log(sortArgs(1, 3, 5, 2, 4, 6));

:large_blue_circle:Array.fromを呼んでArrayに変換する

ES6 (ES2015) 以降ならこの方法もある。

var args = Array.from(arguments);
function sortArgs() {
    return Array.from(arguments).sort().join(',');
}

console.log(sortArgs(1, 3, 5, 2, 4, 6));

:large_blue_circle:Arrayを呼んでArrayに変換する

ちょっとトリッキーな方法。

var args = arguments.length === 1 ? [arguments[0]] :
             Array.apply(null, arguments);
function sortArgs() {
    var args = arguments.length === 1 ?
        [arguments[0]] : Array.apply(null, arguments);
    return args.sort().join(',');
}

console.log(sortArgs(1, 3, 5, 2, 4, 6));

長さが1の時に注意が必要。Array(n)は違う意味になるため。

:large_blue_circle:mapを呼んでArrayに変換する

こういうのもある。

var args = [].map.call(arguments, x => x);
function sortArgs() {
    return [].map.call(arguments, x => x).sort().join(',');
}

console.log(sortArgs(1, 3, 5, 2, 4, 6));

:large_blue_circle:pushを呼んでArrayに変換する

あまり役に立たない。

var args = [];
[].push.apply(args, arguments);

:large_blue_circle:concatを呼んでArrayに変換する

これも役に立たない。

var args = [].concat.apply([], arguments);

:large_blue_circle:ほか

Stack Overflow

Converting the “arguments” object to an array in javascript

21
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
28