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

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

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


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

Ответы [ 44 ]

5 голосов
/ 01 марта 2017

Самый простой и быстрый способ проверить, является ли объект массивом или нет.

 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
5 голосов
/ 28 февраля 2018

Вы можете использовать метод isArray, но я бы предпочел проверить с помощью

Object.getPrototypeOf(yourvariable) === Array.prototype

5 голосов
/ 24 августа 2016

Следующее можно использовать, если вы знаете, что у вашего объекта нет метода concat.

var arr = [];
if (typeof arr.concat === 'function') {
    console.log("It's an array");
}
4 голосов
/ 15 сентября 2017

В вашем случае вы можете использовать concat метод Array , который может принимать как отдельные объекты, так и массивы (и даже комбинированные):

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, кажется,быть одним из старейших методов Array (даже IE 5.5 хорошо это знает).

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

Если только два вида значений, которые могут быть переданы в эту функцию, являются строкой или массивом строк, сохраните это простым и используйте проверку typeof для возможности строки:

function someFunc(arg) {
    var arr = (typeof arg == "string") ? [arg] : arg;
}
4 голосов
/ 24 октября 2016

Эта функция превратит почти все в массив:

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' ]

N.B. Строки будут преобразованы в массив с одним элементом вместо массива символов. Удалите отметку isString, если вы предпочитаете ее наоборот.

Я использовал Array.isArray здесь, потому что это самый надежный , а также самый простой.

4 голосов
/ 12 марта 2013
A = [1,2,3]
console.log(A.map==[].map)

В поисках самой короткой версии вот что я получил до сих пор.

Обратите внимание, что не существует совершенной функции, которая всегда обнаруживает все возможные комбинации. Лучше знать все способности и ограничения ваших инструментов, чем ожидать магический инструмент.

4 голосов
/ 25 февраля 2016

Вы можете попробовать это:

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

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

obj.constructor.prototype.hasOwnProperty('push') // false
4 голосов
/ 30 октября 2013
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))
4 голосов
/ 02 февраля 2014

Простая функция для проверки, является ли входное значение массивом, выглядит следующим образом:

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

Это работает в кросс-браузерных и старых браузерах. Это извлечено из T.J. Сообщение в блоге Crowders

...