web-dev-qa-db-ja.com

オブジェクトが配列でないかどうかを確認するにはどうすればよいですか?

だから私は引数がオブジェクトかどうかをチェックする必要がある関数を持っていますが、これは次の理由で失敗します:

typeof [] // returns 'object'

これは古典的なjavascriptの問題ですが、配列ではなく実際にオブジェクトを受け入れるために何をすべきか思い出せません。

37
hojberg

このようなものを試してください:

obj.constructor.toString().indexOf("Array") != -1

または(さらに良い)

obj instanceof Array
41
Tomas Vana

オブジェクトが "Array"クラスのインスタンス(つまり、 "Array"によって構築されたもの)であるかどうかを(何らかの方法で)確認することを提案するこれらすべての回答は、本当に安全な解決策ではありません。それらは時々、おそらくほとんどの場合は機能しますが、すべての主要なフレームワークはそのアプローチから離れています。これに関する主な問題の1つは、複数のウィンドウ(通常、親ウィンドウと1つ以上のフレームまたはiframeウィンドウ)の間に相互作用があるときに発生します。あるウィンドウで作成された配列オブジェクトを別のウィンドウに常駐するAPIに渡すと、これらのテストはすべて失敗します。どうして?テストしているのは、オブジェクトが "Array"クラスのインスタンスであるかどうかですローカルウィンドウコンテキスト内。つまり、「配列」を参照すると

if (myobject instanceof Array) { ... }

あなたが参照しているのはwindow.Array、 もちろん。 別のウィンドウで構築された配列は、notがウィンドウのArrayクラスのインスタンスになることはありません!

コンストラクター名をチェックすることはおそらく少し安全ですが、それでも危険は伴います。私の意見では、アヒルのタイピングのアプローチを取る方が良いです。つまり、「これは配列ですか?」代わりに、「このオブジェクトは、この状況で必要な特定の一連の配列APIをサポートしているようですか?」たとえば、「このオブジェクトにはlengthプロパティがありますか?」 JavaScriptはかなり「ソフト」な言語であり、ほぼすべてが変更可能です。したがって、たとえ「配列」によって構築されたものを見つけたとしても、あなたはstillでそれに対して、またはそれに対して何ができるのか本当にわかりません。

[編集]そのリンクをありがとう、@ Lachlan-問題の非常に明確な説明があります: http://juhukinners.com/2009/01/11/typeof-considered-useless-or-how-to- write-robust-type-checks /

22
Pointy

特定のオブジェクトが配列であるかどうかを判断するために、ECMAScript 5は Array.isArray() メソッドを導入しています。これは、現在すべての最新のブラウザーでサポートされています。この ECMAScript互換性テーブル を参照してください。

特定のオブジェクトのクラスを判別するには、 Object.prototype.toString() メソッドを使用できます。

Object.prototype.toString.call({}); // "[object Object]"
Object.prototype.toString.call([]); // "[object Array]"
10
Arley

何かがArrayのインスタンスであるかどうかをテストするには:

const arr = [1,2,3];
Array.isArray(arr);  // true

テストは何かがObjectのインスタンスです:

const obj = { 1: 'a', 2: 'b', 3: 'c' };
obj.constructor === Object;  // true

後者の場合、objnullまたはundefinedの場合、エラーがスローされます。あなたは使うことができます:typeof obj === 'object'またはnullチェックを実行します:obj && obj.constructor === Object

9
IliasT

配列は結局のところJavaScriptのオブジェクトなので、変数のタイプがオブジェクトであり、同時にこのオブジェクトがArrayクラスのインスタンスではないかどうかを確認するだけです。

var obj = {fname:'John',lname:'Doe'};

if(typeof obj === 'object' && !(obj instanceof Array)){
  return true ;
} else  {
  return false;
}
6

価値があるのは、jQueryが配列かどうかをチェックする方法です。

isArray: function( arr ) {
    return !!arr && arr.constructor == Array;
}

しかし、- この記事 は、次のようにすることをお勧めします。

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

これを試しましたか:

var test = [];
if(test instanceof Array) {
 ...
}

[〜#〜] edit [〜#〜]:このメソッドは、マルチフレームDOM環境では機能しません( 'typeof'役に立たないと考えられている-または堅牢な型チェックの書き方 )。 (viaPointy

2
Arnold Zokas

Object.prototype.toString.call({}).slice(8,-1)==="Object"を使用してください。これはすべてのデータ型で機能し、call関数内のパラメーターと比較を置き換えて、異なるデータ型をチェックすることもできます。 nullチェックにも機能します

0
Joey Dias
_var obj = {first: 'Stack', last: 'Overflow'};
// var obj = ['Stack', 'overflow']; //You can uncomment this line and comment the above to check..

if(Object.prototype.toString.call(obj) !== '[object Array]') {
    //your code..
    var str = '';
    for(var k in obj) {
        str = str + obj[k] + ' ';
    }
    console.log('I love ', str);
    alert('I love ' + str);
} else {
        console.log('Could not process. Probably an array');
  alert('Could not process. Probably an array');
}

console.log('Length is: ', Object.keys(obj).length);
alert('Length is: ' + Object.keys(obj).length);_

inputArrayまたはObjectとする

オブジェクトがArrayかどうかを確認するには
if(Object.prototype.toString.call(input) === '[object Array]') {}

オブジェクトがObjectかどうかを確認するには
if(Object.prototype.toString.call(input) === '[object Object]') {}


Object.keys(input).lengthは配列とオブジェクトの両方の長さを返すことに注意してください。

JS Fiddle例 同じ

0
Anish Nair

このパッケージを見て

指定されたオブジェクトが古いブラウザの配列でないかどうかを確認します

https://www.npmjs.com/package/notisarray

0
JoeLoco