JavaScript: phát hiện nếu đối số là mảng thay vì đối tượng (Node.JS)


87

Làm cách nào để phát hiện xem đối số có phải là mảng hay không vì typeof []trả về 'object'và tôi muốn phân biệt giữa mảng và đối tượng.

Có thể đối tượng đó sẽ giống như vậy {"0":"string","1":"string","length":"2"}nhưng tôi không muốn nó xuất hiện dưới dạng một mảng nếu nó thực sự là một đối tượng trông giống như một mảng.

JSON.parseJSON.stringifycó thể tạo ra sự khác biệt này. Tôi làm nó như thế nào?

Tôi đang sử dụng Node.JS dựa trên V8 giống như Chrome.

Câu trả lời:


164
  • Array.isArray

chức năng V8 tự nhiên. Nó nhanh chóng, nó luôn luôn chính xác. Đây là một phần của ES5.

  • arr instanceof Array

Kiểm tra xem đối tượng có được tạo bằng phương thức tạo mảng hay không.

Một phương thức từ dấu gạch dưới. Đây là một đoạn trích được lấy từ nguồn của họ

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

Phương thức này nhận một đối tượng và gọi Object.prototype.toStringphương thức trên đó. Điều này sẽ luôn trả về [object Array]cho các mảng.

Theo kinh nghiệm cá nhân của tôi, tôi thấy việc hỏi toStringphương pháp là hiệu quả nhất nhưng nó không ngắn hoặc dễ đọc instanceof Arraycũng như không nhanh bằng Array.isArraynhưng đó là mã ES5 và tôi có xu hướng tránh sử dụng nó vì tính di động.

Cá nhân tôi khuyên bạn nên thử sử dụng underscore, đó là một thư viện với các phương thức tiện ích phổ biến trong đó. Nó có rất nhiều chức năng hữu ích giúp KHÔ mã của bạn.


1
Sử dụng utilthư viện node.js - require('util').isArray(arr) nodejs.org/api/util.html#util_util_isarray_object
Kof

5
nhắc nhở nhẹ nhàng, chúng tôi không yêu cầu ('use'). isArray (arr) trong nút v4.00 trở lên. Nó không được dùng nữa
Sunil Khiatani

Bằng cách nào đó, trong Node 10.x có vẻ như arr instanceof Arraykhông thành công. Tuy nhiên Array.isArray()công việc tuyệt vời.
Alexis Wilke


8

Làm thế nào về:

your_object instanceof Array

Trong V8 trong Chrome, tôi nhận được

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

7

Tôi có vẻ như câu hỏi này có một số câu trả lời hay, nhưng để đầy đủ, tôi sẽ thêm một tùy chọn khác, chưa được đề xuất trước đó.

Để kiểm tra xem một cái gì đó có phải là một mảng hay không, bạn có thể sử dụng utilmô-đun gốc Node.js và isArray()chức năng của nó .

Thí dụ:

var util = require('util');

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

Với phương pháp đó, bạn không phải lo lắng về các tiêu chuẩn JS được thực hiện bởi V8 vì nó sẽ luôn hiển thị câu trả lời đúng.


5
FWIW, util.isArray()hiện proxy để Array.isArray(): github.com/joyent/node/blob/...
Tom Spencer

0

Hãy thử cách này:
console.log (Object.prototype.toString.call (arg) .replace (/ ^ [object (. +)] $ /, '$ 1'). ToLowerCase ())

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.