確認 - javascript 配列かどうか
変数がJavaScriptの配列であるかどうかを確認するにはどうすればよいですか? (16)
.lengthプロパティはjavascriptの配列にとって特別なものなので、単純に言うことができます
obj.length === +obj.length // true if obj is an array
Underscorejsや他のいくつかの図書館では、この短く簡単なトリックを使用しています。
この質問には既に回答があります:
- オブジェクトが配列かどうかを確認しますか? 41の答え
変数が配列かJavaScriptの単一の値かどうかをチェックしたいと思います。
私は可能な解決策を見つけました...
if (variable.constructor == Array)...
これはこれができる最善の方法ですか?
Angularを使用している場合は、angular.isArray()関数を使用できます
var myArray = [];
angular.isArray(myArray); // returns true
var myObj = {};
angular.isArray(myObj); //returns false
function typeOf(value) {
var s = typeof value;
if (s === 'object') {
if (value) {
if (value instanceof Array) {
s = 'array';
}
} else {
s = 'null';
}
}
return s;
}
Crockfordの主な失敗は、別のコンテキスト( window
など)で作成された配列を正しく決定できないことです。 これが不十分な場合、そのページははるかに洗練されたバージョンです。
w3schoolsから:
function isArray(myArray) {
return myArray.constructor.toString().indexOf("Array") > -1;
}
あなたがEcmaScript 5以上を扱っているのであれば、組み込みのArray.isArray
関数を使うことができます
例えば、
Array.isArray([]) // true
Array.isArray("foo") // false
Array.isArray({}) // false
あなたはまた使用することができます:
if (value instanceof Array) {
alert('value is Array!');
} else {
alert('Not an array');
}
これは私にとってはかなり優雅な解決策だと思われますが、彼自身にはそうです。
編集:
ES5の時点では、今もあります:
Array.isArray(value);
しかし、これは古いブラウザーでは機能しません(基本的にIE8など)。
すべての独自性を備えた複数のソリューションがあります。 このページは良い概要を示しています。 考えられる解決策の1つは、
function isArray(o) {
return Object.prototype.toString.call(o) === '[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]
彼らのスクリプトに既にUnderscore.jsライブラリを使用している人のための別のオプションを追加すると思います。 Underscore.jsにはisArray()関数があります( http://underscorejs.org/#isArray参照)。
_.isArray(object)
objectがArrayの場合はtrueを返します。
普遍的な解決策は以下の通りです:
Object.prototype.toString.call(obj)=='[object Array]'
ECMAScript 5からは、正式な解決策は次のとおりです。
Array.isArray(arr)
また、古いJavaScriptライブラリでは、以下の解決策を見つけることができますが、十分正確ではありません。
var is_array = function (value) {
return value &&
typeof value === 'object' &&
typeof value.length === 'number' &&
typeof value.splice === 'function' &&
!(value.propertyIsEnumerable('length'));
};
ソリューションはhttp://www.pixelstech.net/topic/85-How-to-check-whether-an-object-is-an-array-or-not-in-JavaScriptからhttp://www.pixelstech.net/topic/85-How-to-check-whether-an-object-is-an-array-or-not-in-JavaScript
私がこの質問を投稿したとき、私が使用していたJQueryのバージョンにはisArray
関数が含まれていませんでした。 もしそれがあったとしたら、この特定の型チェックを実行するための最良のブラウザ独立型の方法であることを信頼しているでしょう。
JQueryは今この機能を提供しているので、私はいつも使っています...
$.isArray(obj);
(バージョン1.6.2以降)フォーム内の文字列に対する比較を使用して実装されています
toString.call(obj) === "[object Array]"
私がちょうど思いついたもの:
if (item.length) //This is an array else //not an array
私はこのコード行を使用していました。
if (variable.push) {
// variable is array, since AMAIK only arrays have push() method.
}
私はブライアンの答えが好きだった:
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([]);
私は本当のタイプを返すことができるこの少しのコードを作成しました。
私はまだパフォーマンスについてはわかりませんが、タイプを正しく識別しようとしています。
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の誤った再移植であろうと、さらなる改善が歓迎される。
私は誰かがjQueryに言及したことに気づいたが、 isArray()
関数があることは知らなかった。 バージョン1.3で追加されたことが判明しました。
Peterが提案するようにjQueryが実装しています。
isArray: function( obj ) {
return toString.call(obj) === "[object Array]";
},
jQueryに多くの信頼を置いている(特にブラウザ間の互換性のための技術)、私はバージョン1.3にアップグレードし、その機能を使用する(あまりにも多くの問題を引き起こさないことを前提として)コード。
多くの提案に感謝します。