JavaScript: detecta si el argumento es una matriz en lugar de un objeto (Node.JS)

87

¿Cómo debo detectar si el argumento es una matriz porque typeof []devuelve 'object'y quiero distinguir entre matrices y objetos?

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

JSON.parsey JSON.stringifyson capaces de hacer esta distinción. ¿Cómo puedo hacerlo?

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

Bryan Field
fuente

Respuestas:

164
  • 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 creó con el constructor de matriz.

Un método de subrayado. Aquí hay un fragmento tomado de su 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 Object.prototype.toStringmétodo sobre él. Esto siempre regresará [object Array]para matrices.

En mi experiencia personal, encuentro que preguntar toStringcuál es el método es el más efectivo, pero no es tan corto o legible como instanceof Arraytampoco es tan rápido, Array.isArraypero ese es el código ES5 y tiendo a evitar usarlo para la portabilidad.

Personalmente, le recomendaría que pruebe a usar underscore, que es una biblioteca con métodos de utilidad comunes. Tiene muchas funciones útiles que SECAN su código.

Raynos
fuente
1
Utilice la utilbiblioteca node.js - require('util').isArray(arr) nodejs.org/api/util.html#util_util_isarray_object
Kof
5
recordatorio amable, no necesitamos ('util'). isArray (arr) en el nodo v4.00 y superior. Está obsoleto
Sunil Khiatani
De alguna manera, en el Nodo 10.x parece que arr instanceof Arrayfalla. Sin embargo, Array.isArray()funciona muy bien.
Alexis Wilke
71

Prueba este código:

Array.isArray(argument)
T-Bull
fuente
8

Qué tal si:

your_object instanceof Array

En V8 en Chrome obtengo

[] instanceof Array
> true
({}) instanceof Array
> false 
({"0":"string","1":"string","length":"2"}) instanceof Array
> false
t.dubrownik
fuente
7

Parece que esta pregunta tiene varias buenas respuestas, pero para completar, agregaría otra opción, que no se ha sugerido anteriormente.

Para verificar si algo es una matriz, puede usar el utilmódulo nativo de Node.js y suisArray() función.

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 los estándares JS implementados por V8, ya que siempre mostrará la respuesta correcta.

Tom
fuente
5
FWIW, util.isArray()actualmente es proxy de Array.isArray(): github.com/joyent/node/blob/…
Tom Spencer
0

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

LiangWang
fuente