オブジェクトが配列であるかどうかを確認するには?

文字列のリストを受け取るか、単一の文字列を受け取るかの関数を書こうとしています。文字列の場合は、1つの項目だけを持つ配列に変換したいのです。そうすれば、エラーを恐れずにループすることができます。

では、変数が配列であるかどうかを確認するにはどうすればよいのでしょうか?


以下に様々な解決策をまとめて、jsperf testを作ってみました。

ECMAScriptの規格では,Objectのクラスを知るためには,Object.prototypetoStringメソッドを使うことになっています.

if( Object.prototype.toString.call( someVar ) === '[object Array]' ) {
    alert( 'Array!' );
}

あるいは、typeof を使って String であるかどうかをテストすることもできます。

if( typeof someVar === 'string' ) {
    someVar = [ someVar ];
}

また、パフォーマンスを気にしないのであれば、新しい空の配列に concat を実行することもできます。

someVar = [].concat( someVar );

また、コンストラクタを使って直接クエリを実行することもできます。

if (somevar.constructor.name == "Array") {
    // do something
}

以下のコメントに掲載されている@T.J. Crowder'sブログの徹底的な処理をチェックしてください。

どちらの方法が優れているかを知るために、この[ベンチマーク][3]をチェックしてみてください。http://jsben.ch/#/QgYAV

Bharath][4]からは、質問された内容について、Es6を使って文字列を配列に変換しています。

const convertStringToArray = (object) => {
   return (typeof object === 'string') ? Array(object) : object 
}

を想定しています。

let m = 'bla'
let n = ['bla','Meow']
let y = convertStringToArray(m)
let z = convertStringToArray(n)
console.log('check y: '+JSON.stringify(y)) . // check y: ['bla']
console.log('check y: '+JSON.stringify(z)) . // check y: ['bla','Meow']

[3]: http://jsben.ch/#/QgYAV [4]: https://stackoverflow.com/users/8432239/bharath?tab=profile

解説 (29)

私はまず、あなたの実装が isArray をサポートしているかどうかを確認します。

if (Array.isArray)
    return Array.isArray(v);

また、instanceof 演算子を使ってみることもできます。

v instanceof Array
解説 (11)

この関数に渡される値が、文字列か文字列の配列の2種類しかない場合は、シンプルに、文字列の可能性に対して typeof チェックを使用します。

function someFunc(arg) {
    var arr = (typeof arg == "string") ? [arg] : arg;
}
解説 (1)