オブジェクトが配列であるかどうかを確認する方法は?
-
23-10-2019 - |
質問
文字列のリストまたは単一の文字列を受け入れる関数を書き込もうとしています。文字列の場合は、1つのアイテムだけで配列に変換したいと思います。その後、エラーを恐れることなくループできます。
では、変数が配列であるかどうかを確認するにはどうすればよいですか?
以下のさまざまなソリューションをまとめて作成しました jsperfテスト.
解決
現代のブラウザでは、できることです
Array.isArray(obj)
(による支援 Chrome 5、Firefox 4.0、IE 9、Opera 10.5およびSafari 5)
後方互換性については、以下を追加できます
# 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
他のヒント
オブジェクトのクラスを見つけるためにECMAScript標準に与えられた方法は、 toString
からの方法 Object.prototype
.
if( Object.prototype.toString.call( someVar ) === '[object Array]' ) {
alert( 'Array!' );
}
または使用することができます typeof
文字列のかどうかをテストするには:
if( typeof someVar === 'string' ) {
someVar = [ someVar ];
}
または、パフォーマンスについて心配していない場合は、 concat
新しい空の配列に。
someVar = [].concat( someVar );
直接クエリできるコンストラクターもあります。
if (somevar.constructor.name == "Array") {
// do something
}
aをチェックしてください 徹底的な治療 から @TJ Crowder's 以下の彼のコメントに投稿されたブログ。
これをチェックしてください 基準 どのメソッドがパフォーマンスを向上させるかを知るには: http://jsben.ch/#/qgyav
から @bharath 質問のためにES6を使用して文字列を配列に変換します。
const convertStringToArray = (object) => {
return (typeof object === 'string') ? Array(object) : object
}
仮定する:
let m = 'bla'
let n = ['bla','Meow']
let y = convertStringToArray(m)
let z = convertStringToArray(n)
console.log('check y: '+JSON.stringify(y)) . // check y: ['bla']
console.log('check y: '+JSON.stringify(z)) . // check y: ['bla','Meow']
最初にあなたの実装がサポートされているかどうかを確認します isArray
:
if (Array.isArray)
return Array.isArray(v);
使用することもできます instanceof
オペレーター
v instanceof Array
jQueryは、 $.isArray()
方法:
var a = ["A", "AA", "AAA"];
if($.isArray(a)) {
alert("a is an array!");
} else {
alert("a is not an array!");
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
これは、すべての方法の中で最速です(すべてのブラウザがサポートされています):
function isArray(obj){
return !!obj && obj.constructor === Array;
}
あなたがこれを持っていると想像してください 以下の配列:
var arr = [1,2,3,4,5];
JavaScript(新規および古いブラウザ):
function isArray(arr) {
return arr.constructor.toString().indexOf("Array") > -1;
}
また
function isArray(arr) {
return arr instanceof Array;
}
また
function isArray(arr) {
return Object.prototype.toString.call(arr) === '[object Array]';
}
次に、次のように呼びます:
isArray(arr);
JavaScript(IE9+、CH5+、FF4+、SAF5+、Opera10.5+)
Array.isArray(arr);
jQuery:
$.isArray(arr);
Angular:
angular.isArray(arr);
アンダースコアとロダッシュ:
_.isArray(arr);
array.isarrayは速く動作しますが、ブラウザのすべてのバージョンではサポートされていません。そのため、他の人に例外を作成し、普遍的な方法を使用できます。
Utils = {};
Utils.isArray = ('isArray' in Array) ?
Array.isArray :
function (value) {
return Object.prototype.toString.call(value) === '[object Array]';
}
これを確認する単純な関数:
function isArray(object)
{
if (object.constructor === Array) return true;
else return false;
}
MDNが言うように ここに:
使用する array.isarray また object.prototype.tostring.call 通常のオブジェクトを配列と区別します
このような:
Object.prototype.toString.call(arr) === '[object Array]'
, 、 またArray.isArray(arr)
この質問には1つの行の解決策があります
x instanceof Array
ここで、xは変数であり、xが配列である場合にtrueを返し、そうでない場合はfalseになります。
変数のタイプが配列であるかどうかを確認できます。
var myArray=[];
if(myArray instanceof Array)
{
....
}
あなたが扱っているオブジェクトのタイプをテストするための関数を作成します...
function whatAmI(me){ return Object.prototype.toString.call(me).split(/\W/)[2]; }
// tests
console.log(
whatAmI(["aiming","@"]),
whatAmI({living:4,breathing:4}),
whatAmI(function(ing){ return ing+" to the global window" }),
whatAmI("going to do with you?")
);
// output: Array Object Function String
その後、簡単なifステートメントを書くことができます...
if(whatAmI(myVar) === "Array"){
// do array stuff
} else { // could also check `if(whatAmI(myVar) === "String")` here to be sure
// do string stuff
}
私はこれを非常に簡単な方法で行います。私のために働きます。欠点はありますか?
Array.prototype.isArray = true;
a=[]; b={};
a.isArray // true
b.isArray // (undefined -> false)
これが私の改善の試みです この答え コメントを考慮して:
var isArray = myArray && myArray.constructor === Array;
if/elseを取り除き、アレイがnullまたは未定義である可能性を説明します
https://developer.mozilla.org/en-us/docs/javascript/reference/global_objects/array/isarray
Array.isArray = Array.isArray || function (vArg) {
return Object.prototype.toString.call(vArg) === "[object Array]";
};
更新しました jsperf fiddle 2つの代替方法とエラーチェックがあります。
「オブジェクト」と「配列」プロトタイプの定数値を定義するメソッドは、他のどの方法よりも高速であることがわかります。やや驚くべき結果です。
/* Initialisation */
Object.prototype.isArray = function() {
return false;
};
Array.prototype.isArray = function() {
return true;
};
Object.prototype._isArray = false;
Array.prototype._isArray = true;
var arr = ["1", "2"];
var noarr = "1";
/* Method 1 (function) */
if (arr.isArray()) document.write("arr is an array according to function<br/>");
if (!noarr.isArray()) document.write("noarr is not an array according to function<br/>");
/* Method 2 (value) - **** FASTEST ***** */
if (arr._isArray) document.write("arr is an array according to member value<br/>");
if (!noarr._isArray) document.write("noarr is not an array according to member value<br/>");
これらの2つの方法は、変数が未定義の値を取得した場合には機能しませんが、値があると確信している場合は機能します。値が配列または単一の値であるかどうかを念頭に置いてパフォーマンスを確認することに関して、2番目の方法は有効な高速な方法のように見えます。 Chromeの「InstanceOf」よりもわずかに高速で、Internet Explorer、Opera、Safari(私のマシン上)で2番目に最高の方法の2倍の速さです。
私は、人々が何らかの生のJavaScriptアプローチを探していることを知っています。しかし、あまり考えたくない場合は、こちらをご覧ください。 http://underscorejs.org/#isarray
_.isArray(object)
オブジェクトが配列の場合、trueを返します。
(function(){ return _.isArray(arguments); })();
=> false
_.isArray([1,2,3]);
=> true
私が見た最良のソリューションは、TypeOFのクロスブラウザー交換です。アンガスクロールのソリューションを確認してください ここ.
TL; DRバージョンは以下にありますが、この記事は問題の素晴らしい議論なので、時間があれば読む必要があります。
Object.toType = function(obj) {
return ({}).toString.call(obj).match(/\s([a-z|A-Z]+)/)[1].toLowerCase();
}
// ... and usage:
Object.toType([1,2,3]); //"array" (all browsers)
// or to test...
var shouldBeAnArray = [1,2,3];
if(Object.toType(shouldBeAnArray) === 'array'){/* do stuff */};
これが私の怠zyなアプローチです:
if (Array.prototype.array_ === undefined) {
Array.prototype.array_ = true;
}
// ...
var test = [],
wat = {};
console.log(test.array_ === true); // true
console.log(wat.array_ === true); // false
プロトタイプを「混乱させる」ことは犠牲であることを知っていますが、 推奨よりも大幅に優れたパフォーマンスがあるようです toString
方法.
ノート: このアプローチの落とし穴は、それです うまくいきません iframe
境界, 、しかし、私のユースケースでは、これは問題ではありません。
Stoyan Stefanovの本には良い例があります JavaScriptパターン すべての可能な問題を処理するだけでなく、ECMAScript5の方法を利用すると仮定します array.isarray().
だからここにある:
if (typeof Array.isArray === "undefined") {
Array.isArray = function (arg) {
return Object.prototype.toString.call(arg) === "[object Array]";
};
}
ちなみに、JQueryを使用している場合は、その方法を使用できます $ .isarray()
オブジェクトが配列であるかどうかを確認するための最も簡単で最速の方法。
var arr = [];
arr.constructor.name ==='Array' //return true;
また
arr.constructor ===Array //return true;
または、ユーティリティ関数を作成できます。
function isArray(obj){ return obj && obj.constructor ===Array}
利用方法:
isArray(arr); //return true
オブジェクトにconcatメソッドがないことがわかっている場合は、以下を使用できます。
var arr = [];
if (typeof arr.concat === 'function') {
console.log("It's an array");
}
あなたはiSARRAYメソッドですが、私はチェックしたいと思います
Object.getPrototypeOf(yourvariable) === Array.prototype
この関数に渡すことができる2種類の値のみが文字列または文字列の配列である場合、シンプルに保ち、 typeof
文字列の可能性を確認してください:
function someFunc(arg) {
var arr = (typeof arg == "string") ? [arg] : arg;
}
A = [1,2,3]
console.log(A.map==[].map)
ここで私がこれまでに得たものがここにある最短バージョンを探しています。
注意してください、すべての可能な組み合わせを常に検出する完全な関数はありません。 魔法のツールを期待するよりも、ツールのすべての能力と制限を知る方が良いでしょう。
function isArray(value) {
if (value) {
if (typeof value === 'object') {
return (Object.prototype.toString.call(value) == '[object Array]')
}
}
return false;
}
var ar = ["ff","tt"]
alert(isArray(ar))
入力値が配列であるかどうかをテストするための単純な関数は次のとおりです。
function isArray(value)
{
return Object.prototype.toString.call(value) === '[object Array]';
}
これは、クロスブラウザー、および古いブラウザで機能します。これは TJ Crowdersのブログ投稿から引き出されました
あなたはこれを試すことができます:
var arr = []; (or) arr = new Array();
var obj = {}; (or) arr = new Object();
arr.constructor.prototype.hasOwnProperty('push') //true
obj.constructor.prototype.hasOwnProperty('push') // false
この関数は、ほとんどすべてを配列に変えます。
function arr(x) {
if(x === null || x === undefined) {
return [];
}
if(Array.isArray(x)) {
return x;
}
if(isString(x) || isNumber(x)) {
return [x];
}
if(x[Symbol.iterator] !== undefined || x.length !== undefined) {
return Array.from(x);
}
return [x];
}
function isString(x) {
return Object.prototype.toString.call(x) === "[object String]"
}
function isNumber(x) {
return Object.prototype.toString.call(x) === "[object Number]"
}
いくつかの新しいブラウザ機能を使用するため、最大限のサポートのためにこれをポリフィルすることをお勧めします。
例:
> arr(null);
[]
> arr(undefined)
[]
> arr(3.14)
[ 3.14 ]
> arr(1/0)
[ Infinity ]
> gen = function*() { yield 1; yield 2; yield 3; }
[Function: gen]
> arr(gen())
[ 1, 2, 3 ]
> arr([4,5,6])
[ 4, 5, 6 ]
> arr("foo")
[ 'foo' ]
NB文字列は、文字の配列ではなく、単一の要素を持つ配列に変換されます。削除します isString
あなたがそれを逆の方向に望むかどうかを確認してください。
私は使用しました Array.isArray
それがだからです 最も堅牢です また、最も簡単です。
あなたの場合、あなたは使用することができます concat
の方法 配列 単一のオブジェクトとアレイ(および組み合わせた)を受け入れることができます。
function myFunc(stringOrArray)
{
var arr = [].concat(stringOrArray);
console.log(arr);
arr.forEach(function(item, i)
{
console.log(i, "=", item);
})
}
myFunc("one string");
myFunc(["one string", "second", "third"]);
concat
アレイの最も古い方法の1つであるように見えます(IE 5.5でもよく知っています)。