2011-05-09 10 views
61

¿Cómo debo detectar si el argumento es una matriz porque typeof [] devuelve 'object' y quiero distinguir entre matrices y objetos.JavaScript: detectar si el argumento es una matriz en lugar de un objeto (Node.JS)

Es posible que el objeto se vea como {"0":"string","1":"string","length":"2"} pero no quiero que salga como una matriz si se trata de un objeto que se parece a una matriz.

JSON.parse y JSON.stringify son capaces de hacer esta distinción. ¿Cómo puedo hacerlo?

Estoy usando Node.JS que se basa en V8 al igual que Chrome.

Respuesta

135
  • Array.isArray

función V8 nativa. Es rápido, siempre es correcto. Esto es parte de ES5.

  • arr instanceof Array

Comprueba si el objeto se hizo con el constructor array.

Un método de subrayado. Aquí hay un fragmento tomado de la fuente

var toString = Object.prototype.toString, 
    nativeIsArray = Array.isArray; 
_.isArray = nativeIsArray || function(obj) { 
    return toString.call(obj) === '[object Array]'; 
}; 

Este método toma un objeto y llama al método Object.prototype.toString en él. Esto siempre devolverá [object Array] para arreglos.

En mi experiencia personal me parece pidiendo el método toString es el más eficaz, pero no es lo más corta o legible como instanceof Array ni es tan rápido como Array.isArray pero eso es código ES5 y yo tienden a no usarlo para la portabilidad.

Yo personalmente recomendaría que intente utilizar underscore, que es una biblioteca con métodos de utilidad comunes. Tiene muchas funciones útiles que SECAN tu código.

+1

Usar la biblioteca node.js 'util' -' require ('util'). IsArray (arr) 'https://nodejs.org/api/util.html#util_util_isarray_object – Kof

+4

recordatorio suave, no nos requiera ('util ') .isArray (arr) en el nodo v4.00 y superior. Está obsoleto –

5

¿Qué tal:

your_object instanceof Array 

En V8 en Chrome consigo

[] instanceof Array 
> true 
({}) instanceof Array 
> false 
({"0":"string","1":"string","length":"2"}) instanceof Array 
> false 
44

probar este código:

Array.isArray(argument) 
6

Me parece que esta pregunta tiene varias respuestas buenas, pero para completitud, agregaría otra opción, que no se sugirió antes. Para verificar si algo es una matriz, puede usar el módulo nativo Node.js util y su función isArray().

Ejemplo:

var util = require('util'); 

util.isArray([]); // true 
util.isArray(new Array); // true 
util.isArray({"0":"string","1":"string","length":"2"}); // false 

Con ese método no tiene que preocuparse por las normas implementadas por JS V8, ya que siempre mostrará la respuesta correcta.

+3

FWIW, 'util.isArray()' actualmente proxies a 'Array.isArray()': https://github.com/joyent/node/blob/95dbb6bf647d90947c0c738533dadf391559be98/lib/util.js#L508 – fiznool

0

Trate de esta manera:
console.log (. Object.prototype.toString.call (arg) .replace (/^[. Objeto (+)] $ /, '$ 1') toLowerCase())

Cuestiones relacionadas