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




javascript 配列かどうか (19)

あなたがEcmaScript 5以上を扱っているのであれば、組み込みのArray.isArray関数を使うことができます

例えば、

Array.isArray([])    // true
Array.isArray("foo") // false
Array.isArray({})    // false

この質問には既に回答があります:

変数が配列かJavaScriptの単一の値かどうかをチェックしたいと思います。

私は可能な解決策を見つけました...

if (variable.constructor == Array)...

これはこれができる最善の方法ですか?


私は本当のタイプを返すことができるこの少しのコードを作成しました。

私はまだパフォーマンスについてはわかりませんが、タイプを正しく識別しようとしています。

https://github.com/valtido/better-typeOfもここでそれについて少しブログしていますhttp://www.jqui.net/jquery/better-typeof-than-the-javascript-native-typeof/

現在のタイプと同様に動作します。

var user = [1,2,3]
typeOf(user); //[object Array]

それは少し細かい調整が必要かもしれないと思うし、物事を考慮に入れて、私は出くわしたり、それを正しくテストしていない。 それがパフォーマンス上の問題であろうと、typeOfの誤った再移植であろうと、さらなる改善が歓迎される。


私はブライアンの答えが好きだった:

function is_array(o){
    // make sure an array has a class attribute of [object Array]
    var check_class = Object.prototype.toString.call([]);
    if(check_class === '[object Array]')    {
        // test passed, now check
        return Object.prototype.toString.call(o) === '[object Array]';
    } else{
        // may want to change return value to something more desirable
        return -1; 
    }
}

しかし、あなたはちょうどこのようにすることができます:

return Object.prototype.toString.call(o) === Object.prototype.toString.call([]);


.lengthプロパティはjavascriptの配列にとって特別なものなので、単純に言うことができます

obj.length === +obj.length // true if obj is an array

Underscorejsや他のいくつかの図書館では、この短く簡単なトリックを使用しています。


彼らのスクリプトに既にUnderscore.jsライブラリを使用している人のための別のオプションを追加すると思います。 Underscore.jsにはisArray()関数があります( http://underscorejs.org/#isArray参照)。

_.isArray(object) 

objectがArrayの場合はtrueを返します。


私はmyObj.constructor == ObjectとmyArray.constructor == Arrayを使うのが最善の方法だと思います。 toString()を使用するより20倍高速です。 あなた自身のコンストラクタを使ってオブジェクトを拡張し、そのオブジェクトを "オブジェクト"と見なしたい場合、これはうまくいかず、そうでなければその方法が速くなります。 typeofはコンストラクタメソッドと同じくらい速いですが、typeof [] == 'object'はtrueを返すので、しばしば望ましくありません。 http://jsperf.com/constructor-vs-tostring

注目すべき点は、null.constructorはエラーをスローするため、null値をチェックしている場合は、最初に(testThing!== null){}を実行する必要があります。


すべての独自性を備えた複数のソリューションがあります。 このページは良い概要を示しています。 考えられる解決策の1つは、

function isArray(o) {
  return Object.prototype.toString.call(o) === '[object Array]'; 
}

あなたはまた使用することができます:

if (value instanceof Array) {
  alert('value is Array!');
} else {
  alert('Not an array');
}

これは私にとってはかなり優雅な解決策だと思われますが、彼自身にはそうです。

編集:

ES5の時点では、今もあります:

Array.isArray(value);

しかし、これは古いブラウザーでは機能しません(基本的にIE8など)。


私は個人的にPeterの提案が好きです: https://.com/a/767499/414784 : Array.isArray() ECMAScript 3の場合)3. ECMAScript 5の場合はArray.isArray()使用します。

しかし、 toString()がまったく変更された場合、配列をチェックするその方法は失敗します。 実際に具体的にしてtoString()が変更されていないことを確認し、オブジェクトクラス属性に問題がないことを確認するには( [object Array][object Array]のクラス属性です)このようなもの:

//see if toString returns proper class attributes of objects that are arrays
//returns -1 if it fails test
//returns true if it passes test and it's an array
//returns false if it passes test and it's not an array
function is_array(o)
{
    // make sure an array has a class attribute of [object Array]
    var check_class = Object.prototype.toString.call([]);
    if(check_class === '[object Array]')
    {
        // test passed, now check
        return Object.prototype.toString.call(o) === '[object Array]';
    }
    else
    {
        // may want to change return value to something more desirable
        return -1; 
    }
}

JavaScript Definitive Guide第7版7.10では、 Object.prototype.toString.call()はECMAScript 5のObject.prototype.toString.call()を使用して実装されていることに注意してください。また、 toString()のことを心配する場合は、あなたの実装が変わると、あなたはまた、変更された他のすべてのメソッドについても心配する必要があります。 なぜpush()使うのですか? 誰かがそれを変更することができます! そのようなアプローチは愚かです。 上記のチェックはtoString()変更を心配している人に提供される解決策ですが、私はそのチェックが不要だと考えています。


私がちょうど思いついたもの:

if (item.length) //This is an array else //not an array


現代のブラウザ(および一部の従来のブラウザ)では、

Array.isArray(obj)

(Chrome 5、Firefox 4.0、IE 9、Opera 10.5、Safari 5でhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray

古いバージョンのIEをサポートする必要がある場合は、 es5-shimを使用してes5-shimすることができます。 または以下を追加してください

# only implement if no native implementation is available
if (typeof Array.isArray === 'undefined') {
  Array.isArray = function(obj) {
    return Object.prototype.toString.call(obj) === '[object Array]';
  }
};

jQueryを使用する場合は、 jQuery.isArray(obj)または$.isArray(obj)使用できます。 アンダースコアを使用する場合は、_. _.isArray(obj)

異なるフレームで作成された配列を検出する必要がない場合は、単にinstanceof

obj instanceof Array

:関数の引数にアクセスするために使用できるargumentsキーワードは、(通常は)1のように動作しますが、配列ではありません。

var func = function() {
  console.log(arguments)        // [1, 2, 3]
  console.log(arguments.length) // 3
  console.log(Array.isArray(arguments)) // false !!!
  console.log(arguments.slice)  // undefined (Array.prototype methods not available)
  console.log([3,4,5].slice)    // function slice() { [native code] } 
}
func(1, 2, 3)

私がこの質問を投稿したとき、私が使用していたJQueryのバージョンにはisArray関数が含まれていませんでした。 もしそれがあったとしたら、この特定の型チェックを実行するための最良のブラウザ独立型の方法であることを信頼しているでしょう。

JQueryは今この機能を提供しているので、私はいつも使っています...

$.isArray(obj);

(バージョン1.6.2以降)フォーム内の文字列に対する比較を使用して実装されています

toString.call(obj) === "[object Array]"

コードゴルフで最も信頼性の低いテストです。

function isArray(a) {
  return a.map;
}

これは、階層をトラバース/フラット化するときによく使用されます。

function golf(a) {
  return a.map?[].concat.apply([],a.map(golf)):a;
}

input: [1,2,[3,4,[5],6],[7,[8,[9]]]]
output: [1, 2, 3, 4, 5, 6, 7, 8, 9]

私は誰かがjQueryに言及したことに気づいたが、 isArray()関数があることは知らなかった。 バージョン1.3で追加されたことが判明しました。

Peterが提案するようにjQueryが実装しています。

isArray: function( obj ) {
    return toString.call(obj) === "[object Array]";
},

jQueryに多くの信頼を置いている(特にブラウザ間の互換性のための技術)、私はバージョン1.3にアップグレードし、その機能を使用する(あまりにも多くの問題を引き起こさないことを前提として)コード。

多くの提案に感謝します。


変数が配列かどうかをチェックする方法はいくつかあります。 最適なソリューションは、あなたが選択したものです。

variable.constructor === Array

これはChromeで最も速い方法であり、他のすべてのブラウザで使用される可能性が最も高い方法です。 すべての配列はオブジェクトなので、コンストラクタのプロパティをチェックすることはJavaScriptエンジンのための高速な処理です。

オブジェクトプロパティが配列であるかどうかを調べる際に問題がある場合は、まずそのプロパティが存在するかどうかを確認する必要があります。

variable.prop && variable.prop.constructor === Array

いくつかの方法があります:

variable instanceof Array

この方法は、最初の例の約1/3のスピードで実行されます。 あなたがきれいなコードについてであり、パフォーマンスにそれほど関心がないなら、まだかなり固い、もっときれいに見えます。 variable instanceof Number常にfalse返すので、数値のチェックは機能しません。 アップデート: instanceofは2/3速度になりました!

Array.isArray(variable)

この最後の1つは、私の意見では最も醜いです、そして、それは最も遅いのです。 最初の例として速度の約1/5を実行します。 Array.prototypeは、実際は配列です。 あなたはそれについてもっと読むことができますhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray

もう一つのアップデート

Object.prototype.toString.call(variable) === '[object Array]';

この男は、アレイをチェックしようとして最も遅いです。 しかし、これはあなたが探しているすべてのタイプのワンストップショップです。 しかし、配列を探しているので、上記の最速の方法を使用してください。

また、私はいくつかのテストを実行しました: http://jsperf.com/instanceof-array-vs-array-isarray/33 : http://jsperf.com/instanceof-array-vs-array-isarray/33なので、楽しい時を過ごしてください。

注:@EscapeNetscapeはjsperf.comがダウンしているため、別のテストを作成しました。 http://jsben.ch/#/QgYAV jsperfがオンラインに戻るたびに元のリンクが維持されていることを確認したかったのです。


w3schoolsから:

function isArray(myArray) {
    return myArray.constructor.toString().indexOf("Array") > -1;
}

これは古い質問ですが、私は同じ問題を抱えています。私は共有したい非常に洗練されたソリューションを見つけました。

プロトタイプをArrayに追加すると非常に簡単になります

Array.prototype.isArray = true;

今度は、テストするオブジェクトがある場合は、必要な配列に新しいプロパティがあるかどうかを確認する必要があります

var box = doSomething();

if (box.isArray) {
    // do something
}

isArrayは配列の場合のみ使用可能です






variables