¿Cómo puedo comprobar si un objeto es una matriz? [duplicar]

Resuelto mpen asked hace 13 años • 51 respuestas

Estoy intentando escribir una función que acepte una lista de cadenas o una sola cadena. Si es una cadena, entonces quiero convertirla en una matriz con solo un elemento para poder recorrerla sin temor a cometer un error.

Entonces, ¿cómo verifico si la variable es una matriz?

mpen avatar Jan 24 '11 01:01 mpen
Aceptado

El método proporcionado en el estándar ECMAScript para encontrar la clase de Objeto es utilizar el toStringmétodo de Object.prototype.

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

O podrías usar typeofpara probar si es una cadena :

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

O si no le preocupa el rendimiento, puede simplemente hacer concatuna nueva matriz vacía.

someVar = [].concat(someVar);

También está el constructor que puedes consultar directamente:

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

Vea un tratamiento completo del blog de TJ Crowder , tal como se publica en su comentario a continuación.

Consulte este punto de referencia para tener una idea de qué método funciona mejor: http://jsben.ch/#/QgYAV

Desde @Bharath , convierta una cadena en una matriz usando ES6 para la pregunta formulada:

const convertStringToArray = (object) => {
   return (typeof object === 'string') ? Array(object) : object
}

Suponer:

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']
user113716 avatar Jan 23 '2011 18:01 user113716

En los navegadores modernos puedes hacer:

Array.isArray(obj)

( Compatible con Chrome 5, Firefox 4.0, Internet Explorer 9, Opera 10.5 y Safari 5)

Para compatibilidad con versiones anteriores, puede agregar lo siguiente:

// 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]';
  }
};

Si usas jQuery puedes usar jQuery.isArray(obj)o $.isArray(obj). Si usa Underscore.js, puede usar _.isArray(obj).

Si no necesita detectar matrices creadas en diferentes marcos, también puede usar instanceof:

obj instanceof Array
Fela avatar Jan 06 '2014 18:01 Fela

Primero comprobaría si su implementación es compatible isArray:

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

También puedes intentar usar el instanceofoperador.

v instanceof Array
ChaosPandion avatar Jan 23 '2011 18:01 ChaosPandion

jQuery también ofrece un $.isArray()método:

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>
Expandir fragmento

janr avatar Apr 02 '2012 12:04 janr

Este es el más rápido de todos los métodos (se admiten todos los navegadores):

function isArray(obj){
    return !!obj && obj.constructor === Array;
}
shinobi avatar Dec 06 '2015 10:12 shinobi