web-dev-qa-db-ja.com

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

typeof []'object'を返すため、引数が配列かどうかを検出する方法と、配列とオブジェクトを区別したいのですが。

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

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

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

83
Bryan Field
  • 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メソッドに問い合わせるのが最も効果的ですが、instanceof Arrayほど短くも読みにくいし、Array.isArrayほど速くもありませんが、それはES5コードです。移植性のために使用しないようにします。

個人的には underscore を使用することをお勧めします。これは、一般的なユーティリティメソッドを含むライブラリです。 DRYコードをアップする便利な関数がたくさんあります。

158
Raynos

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

Array.isArray(argument)
63
T-Bull

この質問にはいくつかの良い答えがあるようですが、完全を期すために、別のオプションを追加します。

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

例:

var util = require('util');

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

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

7
Tom

どうですか:

your_object instanceof Array

V8ではChromeが得られます

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

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

0
Jacky