JavaScript: mendeteksi jika argumen adalah array, bukan objek (Node.JS)

87

Bagaimana saya harus mendeteksi jika argumennya adalah array karena typeof []mengembalikan 'object'dan saya ingin membedakan antara array dan objek.

Mungkin saja objek itu akan terlihat seperti itu {"0":"string","1":"string","length":"2"}tetapi saya tidak ingin itu keluar sebagai array jika sebenarnya itu adalah objek yang tampak seperti array.

JSON.parsedan JSON.stringifymampu membuat perbedaan ini. Bagaimana saya bisa melakukannya?

Saya menggunakan Node.JS yang didasarkan pada V8 sama dengan Chrome.

Bryan Field
sumber

Jawaban:

164
  • Array.isArray

fungsi V8 asli. Cepat, selalu benar. Ini adalah bagian dari ES5.

  • arr instanceof Array

Memeriksa apakah objek dibuat dengan konstruktor array.

Metode dari garis bawah. Berikut ini cuplikan yang diambil dari sumbernya

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

Metode ini mengambil sebuah objek dan memanggil Object.prototype.toStringmetode di atasnya. Ini akan selalu kembali [object Array]untuk array.

Dalam pengalaman pribadi saya, saya menemukan menanyakan toStringmetode adalah yang paling efektif tetapi tidak sesingkat atau dapat dibaca seperti instanceof Arrayjuga tidak secepat Array.isArraytetapi itu kode ES5 dan saya cenderung menghindari menggunakannya untuk portabilitas.

Saya pribadi merekomendasikan Anda untuk mencoba menggunakan underscore, yang merupakan pustaka dengan metode utilitas umum di dalamnya. Ini memiliki banyak fungsi berguna yang MENGERINGKAN kode Anda.

Raynos
sumber
1
Gunakan utilpustaka node.js - require('util').isArray(arr) nodejs.org/api/util.html#util_util_isarray_object
Kof
5
pengingat lembut, jangan kita membutuhkan ('util']. isArray (arr) di node v4.00 dan di atasnya. Ini tidak berlaku lagi
Sunil Khiatani
Entah bagaimana, di Node 10.x sepertinya arr instanceof Arraygagal. Namun Array.isArray()pekerjaannya bagus.
Alexis Wilke
71

Coba kode ini:

Array.isArray(argument)
T-Bull
sumber
8

Bagaimana tentang:

your_object instanceof Array

Di V8 di Chrome saya dapatkan

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

Sepertinya pertanyaan ini memiliki beberapa jawaban yang bagus, tetapi untuk kelengkapan saya akan menambahkan opsi lain, yang belum pernah disarankan sebelumnya.

Untuk memeriksa apakah ada sesuatu yang berupa array, Anda dapat menggunakan utilmodul native Node.js dan isArray()fungsinya.

Contoh:

var util = require('util');

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

Dengan metode itu Anda tidak perlu khawatir tentang standar JS yang diterapkan oleh V8 karena akan selalu menampilkan jawaban yang benar.

Tom
sumber
5
FWIW, util.isArray()saat ini mewakiliArray.isArray() : github.com/joyent/node/blob/…
Tom Spencer
0

Coba cara ini:
console.log (Object.prototype.toString.call (arg) .replace (/ ^ [object (. +)] $ /, '$ 1'). ToLowerCase ())

LiangWang
sumber