Estoy tratando de 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 un error.
Entonces, ¿cómo verifico si la variable es una matriz?
He redondeado las diversas soluciones a continuación y he creado una prueba jsperf . Todos son rápidos, así que solo úselos Array.isArray
, ahora está bien soportado y funciona en todos los marcos .
arr.constructor === Array
es el más rápido.arr.constructor === Array
prueba devolverá falso.Array.isArray(arr)
todavía devuelve cierto sin embargo.Respuestas:
En los navegadores modernos puedes hacer
( Compatible con Chrome 5, Firefox 4.0, IE 9, Opera 10.5 y Safari 5)
Para compatibilidad con versiones anteriores, puede agregar lo siguiente
Si usa jQuery puede usar
jQuery.isArray(obj)
o$.isArray(obj)
. Si usa guión bajo, puede usar_.isArray(obj)
Si no necesita detectar arreglos creados en diferentes marcos, también puede usar
instanceof
fuente
Array.isArray
if (typeof Array.isArray === 'undefined') {
podría cambiarse aif(!Array.isArray) {
Object.prototype.string.call(obj)
se puede suplantar si el objeto lo tieneSymbol.toStringTag
. Dicho esto, no conozco ningún entorno que se envíe,Symbol.toStringTag
pero noArray.isArray
así, esto parece seguro.instanceof Array
falla si la matriz es de un marco diferente?instanceof Array
falla si la matriz es de un marco diferente porque cada matriz de ese marco diferente tiene unArray
constructor y un prototipo diferentes . Por razones de compatibilidad / seguridad, cada marco tiene su propio entorno global, y esto incluye objetos globales. LoObject
global de un marco es diferente de loObject
global de otro. Así también para losArray
globales. Axel Rauschmayer habla más sobre esto .El método dado en el estándar ECMAScript para encontrar la clase de Objeto es usar el
toString
método desdeObject.prototype
.O podría usar
typeof
para probar si es una cadena:O si no está preocupado por el rendimiento, puede simplemente hacer una
concat
a una nueva matriz vacía.También está el constructor que puede consultar directamente:
Echa un vistazo a un tratamiento exhaustivo del blog de @TJ Crowder , 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
De @Bharath convierte una cadena a una matriz usando Es6 para la pregunta formulada:
suponer:
fuente
toString
es una de las formas de ir. Hago un brevetypeof new String('beans')
> 'objeto'Array.isArray(obj)
Primero verificaría si su implementación admite
isArray
:También puedes intentar usar el
instanceof
operadorfuente
v instanceof Array
devolverá falso siv
se creó en otro marco (v
es una instancia dethatFrame.contentWindow.Array
clase).Array.isArray
se define como parte de ECMAScript 5 / Javascript 1.8.5.return (Array.isArray && Array.isArray(v)) || (v instanceof Array);
jQuery también ofrece un
$.isArray()
método:fuente
$.isArray === Array.isArray
está volviendo verdadera.Array.isArray
detrás de escena: github.com/jquery/jquery/blob/master/src/core.js#L211Este es el más rápido entre todos los métodos (todos los navegadores compatibles):
fuente
if (obj && Array === obj.constructor)
en lugar deif (obj && obj.constructor === Array)
? ¿Se pierde en la traducción al inglés y luego en el código? por ejemplo, los angloparlantes generalmente preguntan "¿existe el objeto, y su constructor proviene de la clase de matriz?", por lo que el flujo de código al leerlo es más lógico. o hay alguna razón técnica?function object_type(o){var t = typeof(o);return ((t==="object") && (o.constructor===Array)) ? "array" : t;} /*allows you to */ switch(object_type(o)){ case 'array': break; case 'object' : o.dosomething();}
Imagina que tienes esta matriz a continuación :
Javascript (navegadores nuevos y antiguos):
o
o
entonces llámalo así:
Javascript (IE9 +, Ch5 +, FF4 +, Saf5 +, Opera10.5 +)
jQuery:
Angular:
Subrayar y Lodash:
fuente
Array.isArray funciona rápido, pero no es compatible con todas las versiones de navegadores. Por lo tanto, puede hacer una excepción para los demás y utilizar el método universal:
fuente
.toString()
métodoObject.prototype
. En este momento estás usando elwindow.toString()
, que no es lo mismo.window.toString
haz lo mismo queObject.prototype.toString
solo en Chrome.Función simple para verificar esto:
fuente
return object.constructor === Array
, pero ¿estás seguro de que esto solo será cierto para las matrices?if(x) return true; else return false
vuelve loco cuando veo :-) Incluso si es al revés, debes negar la expresión.Como dice MDN aquí :
Me gusta esto:
Object.prototype.toString.call(arr) === '[object Array]'
oArray.isArray(arr)
fuente
Solo hay una solución de línea para esta pregunta
donde x es la variable, devolverá verdadero si x es una matriz y falso si no lo es.
fuente
typeof
comparación.{}
una matriz, entonces se obtiene un error de sintaxis.Puede verificar el tipo de su variable si es una matriz con;
fuente
instanceof
... Creo que falla bajo algunos escenarios extraños.Haría una función para probar el tipo de objeto con el que está tratando ...
entonces puedes escribir una declaración if simple ...
fuente
Hago esto de una manera muy simple. Funciona para mi. ¿Algún inconveniente?
fuente
{isArray:true}
JSON.parse(someDataFromElsewhere).items.isArray
podría devolver verdadero (dependiendo de los datos) y romper su código.Este es mi intento de mejorar esta respuesta teniendo en cuenta los comentarios:
Elimina el if / else, y explica la posibilidad de que la matriz sea nula o indefinida
fuente
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/isArray
fuente
He actualizado el violín jsperf con dos métodos alternativos, así como la comprobación de errores.
Resulta que el método que define un valor constante en los prototipos 'Objeto' y 'Matriz' es más rápido que cualquiera de los otros métodos. Es un resultado algo sorprendente.
Estos dos métodos no funcionan si la variable toma el valor indefinido, pero funcionan si está seguro de que tienen un valor. Con respecto a la verificación teniendo en cuenta el rendimiento si un valor es una matriz o un valor único, el segundo método parece un método rápido válido. Es ligeramente más rápido que 'instanceof' en Chrome, dos veces más rápido que el segundo mejor método en Internet Explorer, Opera y Safari (en mi máquina).
fuente
Sé que la gente está buscando algún tipo de enfoque de JavaScript sin formato. Pero si quiere pensar menos, eche un vistazo aquí: http://underscorejs.org/#isArray
Devuelve verdadero si el objeto es una matriz.
fuente
La mejor solución que he visto es un reemplazo entre navegadores para typeof. Comprueba la solución de Angus Croll aquí .
La versión TL; DR está a continuación, pero el artículo es una gran discusión sobre el tema, por lo que debe leerlo si tiene tiempo.
fuente
Aquí está mi enfoque perezoso:
Sé que es un sacrilegio "meterse" con el prototipo, pero parece funcionar significativamente mejor que el
toString
método recomendado .Nota: Una trampa de este enfoque es que no funcionará más allá de los
iframe
límites , pero para mi caso de uso esto no es un problema.fuente
wat = {array_: true}
objetos.obj.array_ = true
, entonces solo te estás engañando a ti mismo .cache
objeto para memorizar resultados de búsqueda que use las cadenas de búsqueda como claves de propiedad. ¿Qué pasa si un usuario buscaarray_
? ¿Su objeto se convierte en una matriz debido a eso? Es solo un error..array_
se usa para etiquetar matrices. Ese no es realmente el caso aquí,.array
puede significar cualquier cosa. Al menos debe usar una cadena descriptiva y señalar la inadecuación del uso arbitrario, por ejemplo, con.__isArray = true
.Hay un buen ejemplo en el libro Patrones JavaScript de Stoyan Stefanov que supone manejar todos los problemas posibles y utilizar el método ECMAScript 5 Array.isArray () .
Asi que aqui esta:
Por cierto, si está usando jQuery, puede usar su método $ .isArray ()
fuente
if(!Array.isArray) {...
?La forma más fácil y rápida de verificar si un objeto es una matriz o no.
o
o puedes hacer una función de utilidad:
uso:
fuente
Lo siguiente podría usarse si sabe que su objeto no tiene un método concat.
fuente
Podrías es el método de matriz, pero preferiría consultar con
Object.getPrototypeOf(yourvariable) === Array.prototype
fuente
Object.getPrototypeOf(yourvariable)
devuelve el prototipo de un objeto Array. Y el código es más rápido y seguro.Si los únicos dos tipos de valores que podrían pasarse a esta función son una cadena o una matriz de cadenas, manténgalo simple y use una
typeof
verificación para la posibilidad de la cadena:fuente
En la búsqueda de la versión más corta, esto es lo que obtuve hasta ahora.
Tenga en cuenta que no existe una función perfecta que siempre detecte todas las combinaciones posibles. Es mejor conocer todas las habilidades y limitaciones de sus herramientas que esperar una herramienta mágica.
fuente
A.map !== undefined
pero sí, eso podría ser un camino resbaladizo en el mundo de los patchers de mono;)fuente
Una función simple para probar si un valor de entrada es una matriz es la siguiente:
Esto funciona en varios navegadores y con navegadores más antiguos. Esto se extrae de la publicación del blog de TJ Crowders
fuente
Puedes probar esto:
fuente
Esta función convertirá casi cualquier cosa en una matriz:
Utiliza algunas características más nuevas del navegador, por lo que es posible que desee rellenar esto para obtener el máximo soporte.
Ejemplos:
Las cadenas NB se convertirán en una matriz con un solo elemento en lugar de una matriz de caracteres. Elimine el
isString
cheque si lo prefiere al revés.Lo he usado
Array.isArray
aquí porque es el más robusto y también el más simple.fuente
En su caso, puede usar el
concat
método de matriz que puede aceptar objetos individuales, así como matriz (e incluso combinados):concat
parece ser uno de los métodos más antiguos de Array (incluso IE 5.5 lo sabe bien).fuente