JavaScript:引数がオブジェクトではなく配列であるかどうかを検出します(Node.JS)


87

typeof []返され'object'、配列とオブジェクトを区別したいので、引数が配列であるかどうかをどのように検出する必要がありますか。

オブジェクトが次のように見える可能性はあります{"0":"string","1":"string","length":"2"}が、実際には配列のように見えるオブジェクトである場合は、配列として表示されたくありません。

JSON.parseそしてJSON.stringify、この区別をすることができます。どうすればいいですか?

Chromeと同じV8ベースのNode.JSを使用しています。

回答:


164
  • Array.isArray

ネイティブV8機能。それは速いです、それは常に正しいです。これはES5の一部です。

  • arr instanceof Array

オブジェクトが配列コンストラクターで作成されたかどうかを確認します。

アンダースコアからの方法。これが彼らのソースから取られたスニペットです

var toString = Object.prototype.toString,
    nativeIsArray = Array.isArray;
_.isArray = nativeIsArray || function(obj) {
    return toString.call(obj) === '[object Array]';
};

このメソッドはオブジェクトを受け取り、そのオブジェクトのObject.prototype.toStringメソッドを呼び出します。これは常に[object Array]配列に対して返されます。

私の個人的な経験でtoStringは、この方法を尋ねることが最も効果的であると思いますが、それはES5コードほど短くも読みやすくinstanceof Arrayも速くもありませんが、それはArray.isArrayES5コードであり、移植性のために使用することを避ける傾向があります。

個人的にunderscoreは、一般的なユーティリティメソッドを含むライブラリであるを使用することをお勧めします。それはあなたのコードを乾かす多くの便利な関数を持っています。


1
使用のNode.jsutilライブラリ- require('util').isArray(arr) nodejs.org/api/util.html#util_util_isarray_object
Kofの

5
穏やかなリマインダー、ノードv4.00以降ではrequire( 'util')。isArray(arr)を使用しないでください。非推奨
Sunil Khiatani 2016

どういうわけか、ノード10.xではarr instanceof Array失敗したように見えます。しかし、Array.isArray()うまくいきます。
Alexis Wilke 2018

71

このコードを試してください:

Array.isArray(argument)

8

どうですか:

your_object instanceof Array

ChromeのV8では

[] instanceof Array
> true
({}) instanceof Array
> false 
({"0":"string","1":"string","length":"2"}) instanceof Array
> false

7

この質問にはいくつかの良い答えがあるように見えますが、完全を期すために、以前は提案されていなかった別のオプションを追加します。

何かが配列であるかどうかを確認するために、Node.jsutilネイティブモジュールとそのisArray()関数を使用できます。

例:

var util = require('util');

util.isArray([]);  // true
util.isArray(new Array); // true
util.isArray({"0":"string","1":"string","length":"2"}); // false

この方法を使用すると、常に正しい答えが表示されるため、V8によって実装されたJS標準について心配する必要はありません。


5
FWIW、util.isArray()現在プロキシArray.isArray()github.com/joyent/node/blob/…–
トムスペンサー

0

この方法を試してください:
console.log(Object.prototype.toString.call(arg).replace(/ ^ [object(。+)] $ /、 '$ 1')。toLowerCase())

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.