JavaScript: wykryj, czy argument jest tablicą zamiast obiektem (Node.JS)

87

Jak mam wykryć, czy argument jest tablicą, ponieważ typeof []zwraca 'object'i chcę rozróżnić tablice i obiekty.

Możliwe, że obiekt będzie wyglądał, {"0":"string","1":"string","length":"2"}ale nie chcę, aby wyszedł jako tablica, jeśli w rzeczywistości jest to obiekt wyglądający jak tablica.

JSON.parsei JSON.stringifypotrafią dokonać tego rozróżnienia. Jak mogę to zrobić?

Używam Node.JS, który jest oparty na V8 tak samo jak Chrome.

Bryan Field
źródło

Odpowiedzi:

164
  • Array.isArray

natywna funkcja V8. Jest szybki, zawsze jest poprawny. To jest część ES5.

  • arr instanceof Array

Sprawdza, czy obiekt został utworzony za pomocą konstruktora tablicy.

Metoda z podkreślenia. Oto fragment pobrany z ich źródła

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

Ta metoda przyjmuje obiekt i wywołuje na nim Object.prototype.toStringmetodę. To zawsze będzie zwracane w [object Array]przypadku tablic.

Z własnego doświadczenia toStringwynika, że ​​najskuteczniejsza jest metoda zadawania pytań, ale nie jest tak krótka ani czytelna, jak instanceof Arrayi nie jest tak szybka jak, Array.isArrayale to jest kod ES5 i staram się unikać używania go do przenoszenia.

Osobiście poleciłbym spróbować użyć underscore, która jest biblioteką z typowymi metodami narzędziowymi. Posiada wiele przydatnych funkcji, które OSUSZA Twój kod.

Raynos
źródło
1
Użyj utilbiblioteki node.js - require('util').isArray(arr) nodejs.org/api/util.html#util_util_isarray_object
Kof
5
delikatne przypomnienie, nie wymagamy ('util'). isArray (arr) w węźle v4.00 i nowszych. Jest przestarzały
Sunil Khiatani
Jakoś w Node 10.x wygląda na to, że arr instanceof Arraynie działa. Jednak Array.isArray()działa świetnie.
Alexis Wilke,
71

Wypróbuj ten kod:

Array.isArray(argument)
T-Bull
źródło
8

Co powiesz na:

your_object instanceof Array

W V8 w Chrome dostaję

[] instanceof Array
> true
({}) instanceof Array
> false 
({"0":"string","1":"string","length":"2"}) instanceof Array
> false
t.dubrownik
źródło
7

Wygląda na to, że to pytanie ma kilka dobrych odpowiedzi, ale dla kompletności dodałbym inną opcję, której wcześniej nie sugerowano.

Aby sprawdzić, czy coś jest tablicą, możesz użyć utilnatywnego modułu Node.js i jego isArray()funkcji.

Przykład:

var util = require('util');

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

Dzięki tej metodzie nie musisz się martwić o standardy JS zaimplementowane przez V8, ponieważ zawsze pokaże właściwą odpowiedź.

Tomek
źródło
5
FWIW, util.isArray()obecnie proxy Array.isArray(): github.com/joyent/node/blob/…
Tom Spencer.
0

Spróbuj w ten sposób:
console.log (Object.prototype.toString.call (arg) .replace (/ ^ [object (. +)] $ /, '$ 1'). ToLowerCase ())

LiangWang
źródło