Как проверить, является ли объект массивом? - PullRequest
2467 голосов
/ 23 января 2011

Я пытаюсь написать функцию, которая принимает список строк или одну строку. Если это строка, то я хочу преобразовать ее в массив только с одним элементом. Тогда я могу зацикливаться на этом, не боясь ошибки.

Так как мне проверить, является ли переменная массивом?


Я собрал различные решения ниже и создал jsperf test .

Ответы [ 44 ]

1905 голосов
/ 23 января 2011

Метод, указанный в стандарте ECMAScript для поиска класса Object, заключается в использовании метода toString из Object.prototype.

if( Object.prototype.toString.call( someVar ) === '[object Array]' ) {
    alert( 'Array!' );
}

Или вы можете использовать typeof, чтобы проверить, является ли онa String:

if( typeof someVar === 'string' ) {
    someVar = [ someVar ];
}

Или, если вас не беспокоит производительность, вы можете просто сделать concat для нового пустого массива.

someVar = [].concat( someVar );

Также есть конструктор, которыйВы можете запросить напрямую:

if (somevar.constructor.name == "Array") {
    // do something
}

Ознакомьтесь с тщательной обработкой из @ TJ Crowder блога, как указано в его комментарии ниже.

Проверьте этот бенчмарк , чтобы понять, какой метод работает лучше: 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']
1246 голосов
/ 23 января 2011

Сначала я проверю, поддерживает ли ваша реализация isArray:

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

Вы также можете попробовать использовать оператор instanceof

v instanceof Array
688 голосов
/ 06 января 2014

В современных браузерах вы можете сделать

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
289 голосов
/ 02 апреля 2012

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>
96 голосов
/ 06 декабря 2015

Это самый быстрый из всех методов (поддерживаются все браузеры):

function isArray(obj){
    return !!obj && obj.constructor === Array;
}
37 голосов
/ 27 декабря 2016

Представьте, что у вас есть этот массив ниже:

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);

Подчеркивание и Lodash:

_.isArray(arr);
32 голосов
/ 10 декабря 2012

Array.isArray работает быстро, но поддерживается не всеми версиями браузеров. Таким образом, вы можете сделать исключение для других и использовать универсальный метод:

    Utils = {};    
    Utils.isArray = ('isArray' in Array) ? 
        Array.isArray : 
        function (value) {
            return Object.prototype.toString.call(value) === '[object Array]';
        }
22 голосов
/ 04 сентября 2012

Простая функция, чтобы проверить это:

function isArray(object)
{
    if (object.constructor === Array) return true;
    else return false;
}
15 голосов
/ 08 июня 2017

Для этого вопроса есть только одно строчное решение

x instanceof Array

, где x - переменная, которая вернет true, если x - массив, и false, если нет.

15 голосов
/ 15 сентября 2012

Как MDN говорит здесь :

используйте Array.isArray или Object.prototype.toString.call для дифференциации обычные объекты из массивов

Как это:

  • Object.prototype.toString.call(arr) === '[object Array]' или

  • Array.isArray(arr)

...