JavaScript: rileva se l'argomento è un array anziché un oggetto (Node.JS)


87

Come devo rilevare se l'argomento è un array perché typeof []ritorna 'object'e voglio distinguere tra array e oggetti.

È possibile che l'oggetto assomigli {"0":"string","1":"string","length":"2"}ma non voglio che esca come un array se in realtà è un oggetto che sembra un array.

JSON.parsee JSON.stringifysono in grado di fare questa distinzione. Come posso farlo?

Sto usando Node.JS che è basato su V8 ​​lo stesso di Chrome.

Risposte:


164
  • Array.isArray

funzione V8 nativa. È veloce, è sempre corretto. Questo fa parte di ES5.

  • arr instanceof Array

Verifica se l'oggetto è stato creato con il costruttore dell'array.

Un metodo dal carattere di sottolineatura. Ecco uno snippet tratto dalla loro fonte

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

Questo metodo prende un oggetto e chiama il Object.prototype.toStringmetodo su di esso. Ciò tornerà sempre [object Array]per gli array.

Nella mia esperienza personale trovo che chiedere il toStringmetodo sia il più efficace ma non è così breve o leggibile come instanceof Arrayné è veloce come, Array.isArrayma è il codice ES5 e tendo a evitare di usarlo per la portabilità.

Personalmente consiglierei di provare a utilizzare underscore, che è una libreria con metodi di utilità comuni al suo interno. Ha molte funzioni utili che ASCIUGANO il tuo codice.


1
Usa la utillibreria node.js - require('util').isArray(arr) nodejs.org/api/util.html#util_util_isarray_object
Kof

5
promemoria gentile, non richiedere ('util'). isArray (arr) nel nodo v4.00 e versioni successive. È deprecato
Sunil Khiatani

In qualche modo, nel nodo 10.x sembra che arr instanceof Arrayfallisca. Comunque Array.isArray()funziona alla grande.
Alexis Wilke

71

Prova questo codice:

Array.isArray(argument)

8

Che ne dite di:

your_object instanceof Array

In V8 in Chrome ottengo

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

7

Sembra che questa domanda abbia diverse buone risposte, ma per completezza aggiungerei un'altra opzione, che non è stata suggerita in precedenza.

Per verificare se qualcosa è un array, puoi utilizzare il utilmodulo nativo Node.js e la sua isArray()funzione.

Esempio:

var util = require('util');

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

Con quel metodo non devi preoccuparti degli standard JS implementati da V8 in quanto mostrerà sempre la risposta giusta.


5
FWIW, util.isArray()attualmente in proxy a Array.isArray(): github.com/joyent/node/blob/…
Tom Spencer,

0

Prova in questo modo:
console.log (Object.prototype.toString.call (arg) .replace (/ ^ [object (. +)] $ /, '$ 1'). ToLowerCase ())

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.