2011-05-09 30 views
61

Làm cách nào để phát hiện nếu đối số là một mảng vì typeof [] trả về 'object' và tôi muốn phân biệt giữa mảng và đối tượng.JavaScript: phát hiện nếu đối số là mảng thay vì đối tượng (Node.JS)

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

JSON.parseJSON.stringify có thể tạo 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 với Chrome.

Trả lời

135
  • Array.isArray

chức năng V8 bản địa. Nó nhanh, nó luôn đúng. Đây là một phần của ES5.

  • arr instanceof Array

Kiểm tra xem các đối tượng đã được thực hiện với các nhà xây dựng mảng.

Một phương pháp từ gạch dưới. Dưới đây là một đoạn trích được lấy từ nguồn của chúng

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

Phương pháp này lấy một đối tượng và gọi phương thức Object.prototype.toString trên đó. Điều này sẽ luôn trả lại [object Array] cho mảng. Trong kinh nghiệm cá nhân của tôi, tôi thấy yêu cầu phương pháp toString hiệu quả nhất nhưng không ngắn hoặc dễ đọc như instanceof Array cũng không nhanh như Array.isArray nhưng đó là mã ES5 và tôi có xu hướng tránh sử dụng nó cho tính di động.

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

+1

Sử dụng thư viện 'util' của node.js -' require ('util'). IsArray (arr) 'https://nodejs.org/api/util.html#util_util_isarray_object – Kof

+4

lời nhắc nhở nhẹ nhàng, không yêu cầu chúng tôi ('util ') .isArray (arr) trong nút v4.00 trở lên. Nó không được chấp nhận –

5

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 
44

Hãy thử mã này:

Array.isArray(argument) 
6

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

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

Ví 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 mà bạn không cần phải lo lắng về các tiêu chuẩn JS thực hiện bởi động cơ V8 vì nó sẽ luôn hiển thị câu trả lời đúng.

+3

FWIW, 'util.isArray()' hiện đang ủy quyền cho 'Array.isArray()': https://github.com/joyent/node/blob/95dbb6bf647d90947c0c738533dadf391559be98/lib/util.js#L508 – fiznool

0

Hãy thử cách này:
console.log (. Object.prototype.toString.call (arg) .replace (/^[. Đối tượng (+)] $ /, '$ 1') toLowerCase())

Các vấn đề liên quan