JavaScript: detecta se o argumento é uma matriz em vez de um objeto (Node.JS)

87

Como devo detectar se o argumento é uma matriz porque typeof []retorna 'object'e quero distinguir entre matrizes e objetos.

É possível que o objeto se pareça, {"0":"string","1":"string","length":"2"}mas não quero que saia como um array se for de fato um objeto parecido com um array.

JSON.parsee JSON.stringifysão capazes de fazer essa distinção. Como eu posso fazer isso?

Estou usando o Node.JS, que é baseado no V8 da mesma forma que no Chrome.

Bryan Field
fonte

Respostas:

163
  • Array.isArray

função V8 nativa. É rápido, está sempre correto. Isso faz parte do ES5.

  • arr instanceof Array

Verifica se o objeto foi feito com o construtor do array.

Um método de sublinhado. Aqui está um snippet retirado de sua fonte

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

Este método pega um objeto e chama o Object.prototype.toStringmétodo nele. Isso sempre retornará [object Array]para matrizes.

Em minha experiência pessoal, acho que pedir o toStringmétodo é o mais eficaz, mas não é tão curto ou legível instanceof Arraynem tão rápido, Array.isArraymas esse é o código ES5 e tendo a evitar usá-lo para portabilidade.

Eu pessoalmente recomendo que você tente usar underscore, que é uma biblioteca com métodos utilitários comuns. Tem muitas funções úteis que DRY até seu código.

Raynos
fonte
1
Use a utilbiblioteca node.js - require('util').isArray(arr) nodejs.org/api/util.html#util_util_isarray_object
Kof de
5
lembrete gentil, não precisamos de ('util'). isArray (arr) no nó v4.00 e acima. O uso foi suspenso
Sunil Khiatani
De alguma forma, no Nó 10.x, parece que arr instanceof Arrayfalha. No entanto, Array.isArray()funciona muito bem.
Alexis Wilke
69

Experimente este código:

Array.isArray(argument)
T-Bull
fonte
8

E se:

your_object instanceof Array

No V8 no Chrome eu recebo

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

Parece que esta pergunta tem várias respostas boas, mas para completar, eu adicionaria outra opção, que não foi sugerida anteriormente.

Para verificar se algo é um array, você pode usar o utilmódulo nativo Node.js e seuisArray() função.

Exemplo:

var util = require('util');

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

Com esse método, você não precisa se preocupar com os padrões JS implementados pelo V8, pois ele sempre mostrará a resposta certa.

Tom
fonte
5
FWIW, util.isArray()atualmente atua como proxy para Array.isArray(): github.com/joyent/node/blob/…
Tom Spencer
0

Tente desta forma:
console.log (Object.prototype.toString.call (arg) .replace (/ ^ [object (. +)] $ /, '$ 1'). ToLowerCase ())

LiangWang
fonte