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.

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.


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)

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

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.


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 ())

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.