連想配列 - 配列かどうか javascript




オブジェクトが配列かどうかを確認しますか? (20)

私は、文字列のリスト、または単一の文字列を受け入れる関数を記述しようとしています。 文字列の場合は、1つの項目だけを配列に変換します。 それから私はエラーの恐れなしにそれをループすることができます。

どうすれば変数が配列かどうかを確認できますか?

私は以下のさまざまなソリューションをまとめ、 jsperfテストを作成しました。


Array.isArrayは高速で動作しますが、すべてのバージョンのブラウザでサポートされているわけではありません。 したがって、他の人には例外を作成し、普遍的なメソッドを使用することができます:

    Utils = {};    
    Utils.isArray = ('isArray' in Array) ? 
        Array.isArray : 
        function (value) {
            return Object.prototype.toString.call(value) === '[object Array]';
        }

MDN がここに言うよう

Array.isArrayまたはObject.prototype.toString.callを使用して、通常のオブジェクトと配列を区別します

このような:

  • Object.prototype.toString.call(arr) === '[object Array]' 、または

  • Array.isArray(arr)


Stoyan Stefanovの本「 JavaScript Patterns」には、ECMAScript 5のArray.isArray()メソッドを利用するだけでなく、考えられるすべての問題を処理すると思われる素晴らしい例があります。

だからここにある:

if (typeof Array.isArray === "undefined") {
    Array.isArray = function (arg) {
        return Object.prototype.toString.call(arg) === "[object Array]";
    };
}

ところで、jQueryを使用している場合は、 $.isArray()メソッドを使用できます。


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>


あなたのオブジェクトがconcatメソッドを持っていないことが分かっている場合は、以下を使用することができます。

var arr = [];
if (typeof arr.concat === 'function') {
    console.log("It's an array");
}


あなたの実装がisArrayサポートしているかどうか最初にチェックします:

if (Array.isArray)
    return Array.isArray(v);

また、 instanceof演算子を使用して試すこともできinstanceof

v instanceof Array

あなたはこれを試すことができます:

var arr = []; (or) arr = new Array();
var obj = {}; (or) arr = new Object();

arr.constructor.prototype.hasOwnProperty('push') //true

obj.constructor.prototype.hasOwnProperty('push') // false


この関数に渡すことができる唯一の2種類の値が文字列または文字列である場合は、単純なままにして、可能性のある文字列の型チェックを使用します。

function someFunc(arg) {
    var arr = (typeof arg == "string") ? [arg] : arg;
}

この関数は、ほとんどすべてを配列に変換します:

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を使用しArray.isArrayた。なぜなら、 最も堅牢でシンプルなのでです。


これはコメントを考慮に入れてこの回答を改善する私の試みです:

var isArray = myArray && myArray.constructor === Array;

if / elseを取り除き、配列がnullまたは未定義である可能性を考慮する


これをチェックする簡単な関数:

function isArray(object)
{
    if (object.constructor === Array) return true;
    else return false;
}

入力値が配列であるかどうかをテストする簡単な関数は次のとおりです。

function isArray(value)
{
  return Object.prototype.toString.call(value) === '[object Array]';
}

これはクロスブラウザーと古いブラウザーで動作します。 これはTJ Crowdersのブログ記事から抜粋したものです


次の配列があるとします:

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.isArray(arr);

アンダースコアとロダシュ:

_.isArray(arr);

私が見てきた最良の解決策は、typeofのためのクロスブラウザーの置き換えです。 here Angus Crollのソリューションを確認してください。

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 */};

私の怠惰なアプローチは次のとおりです。

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境界を越えて動作しないことですが、私の使用例ではこれは問題ではありません。


私はあなたが扱っているオブジェクトの型をテストする関数を作るだろう...

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 myArray=[];

if(myArray instanceof Array)
{
....
}

A = [1,2,3]
console.log(A.map==[].map)

ここで最短バージョンを検索すると、これまでに得たものがあります。

可能なすべての組み合わせを常に検出する完璧な機能はありません。 魔法のツールを期待するよりも、あなたのツールのすべての能力と限界を知る方がよいでしょう。





arrays