Câu hỏi Kiểm tra nếu đối tượng là mảng?


Tôi đang cố gắng viết một hàm hoặc chấp nhận một danh sách các chuỗi, hoặc một chuỗi đơn. Nếu đó là một chuỗi, thì tôi muốn chuyển đổi nó thành một mảng chỉ với một mục. Sau đó, tôi có thể lặp lại nó mà không sợ lỗi.

Vậy làm cách nào để kiểm tra xem biến có phải là một mảng không?


Tôi đã làm tròn các giải pháp khác nhau bên dưới và tạo kiểm tra jsperf.


2146
2018-01-23 18:53


gốc


Tôi nghĩ bạn có nghĩa là để 'kiểm tra nếu đối tượng là một mảng', nhưng bạn muốn kiểm tra xem 'đối tượng là một mảng của chuỗi hoặc một chuỗi duy nhất' cụ thể. Bạn không chắc chắn nếu bạn nhìn thấy nó? hay la chỉ Minh tôi? Tôi đã nghĩ về một cái gì đó giống như điều này... tôi có phải là người thiếu cái gì ở đây không? - rr1g0
TL; DR - - arr.constructor === Array là nhanh nhất. - Neta
jsben.ch/#/QgYAV - điểm chuẩn cho các cách phổ biến nhất - EscapeNetscape
TL; DR - Mảng.isArray (arr) kể từ ES5; và $.isArray (arr)trong jQuery. - Ondra Žižka
Chỉ cần nhớ rằng nếu bạn bởi bất kỳ lý do nào ghi đè lên nhà xây dựng của bạn thông qua nguyên mẫu arr.constructor === Array kiểm tra sẽ trả về false. Array.isArray(arr) vẫn trả về đúng mặc dù. - ghaschel


Các câu trả lời:


Trong các trình duyệt hiện đại, bạn có thể làm

Array.isArray(obj)

(Được hỗ trợ bởi Chrome 5, Firefox 4.0, IE 9, Opera 10.5 và Safari 5)

Để tương thích ngược, bạn có thể thêm các mục sau

# only implement if no native implementation is available
if (typeof Array.isArray === 'undefined') {
  Array.isArray = function(obj) {
    return Object.prototype.toString.call(obj) === '[object Array]';
  }
};

Nếu bạn sử dụng jQuery, bạn có thể sử dụng jQuery.isArray(obj) hoặc là $.isArray(obj). Nếu bạn sử dụng dấu gạch dưới, bạn có thể sử dụng _.isArray(obj)

Nếu bạn không cần phát hiện các mảng được tạo trong các khung khác nhau, bạn cũng có thể sử dụng instanceof

obj instanceof Array

319
2018-01-06 18:11



Đây là hoàn chỉnh hơn danh sách các trình duyệt hỗ trợ Array.isArray - lightswitch05
if (typeof Array.isArray === 'undefined') { có thể được thay đổi thành if(!Array.isArray) { - iMatoria
Cho những gì nó có giá trị Object.prototype.string.call(obj) có thể bị giả mạo nếu đối tượng có Symbol.toStringTag trên đó. Điều đó nói rằng tôi không biết về bất kỳ môi trường nào Symbol.toStringTag nhưng không Array.isArray vì vậy điều này có vẻ an toàn. - Benjamin Gruenbaum


Phương thức được đưa ra trong tiêu chuẩn ECMAScript để tìm lớp Object là sử dụng toString phương pháp từ Object.prototype.

if( Object.prototype.toString.call( someVar ) === '[object Array]' ) {
    alert( 'Array!' );
}

Hoặc bạn có thể sử dụng typeof để kiểm tra nếu nó là một String:

if( typeof someVar === 'string' ) {
    someVar = [ someVar ];
}

Hoặc nếu bạn không quan tâm đến hiệu suất, bạn chỉ có thể làm concat đến một mảng trống mới.

someVar = [].concat( someVar );

Ngoài ra còn có các nhà xây dựng mà bạn có thể truy vấn trực tiếp:

if (somevar.constructor.name == "Array") {
    // do something
}

Kiểm tra một xử lý triệt để từ @ T.J. Crowder's blog, như được đăng trong bình luận của mình dưới đây.

Kiểm tra này điểm chuẩn để có ý tưởng về phương pháp nào hoạt động tốt hơn: http://jsben.ch/#/QgYAV

Từ @Bharath chuyển đổi chuỗi thành mảng bằng cách sử dụng Es6 cho câu hỏi được hỏi:

const convertStringToArray = (object) => {
   return (typeof object === 'string') ? Array(object) : object 
}

giả sử:

let m = 'bla'
let n = ['bla','Meow']
let y = convertStringToArray(m)
let z = convertStringToArray(n)
console.log('check y: '+JSON.stringify(y)) . // check y: ['bla']
console.log('check y: '+JSON.stringify(z)) . // check y: ['bla','Meow']

1866
2018-01-23 18:54



+1 Yup, toString là một trong những cách để đi. Tôi làm một chút về một roundup ở đây: blog.niftysnippets.org/2010/09/say-what.html - T.J. Crowder
Nếu bạn không muốn gõ "[đối tượng mảng]" sử dụng Object.prototype.toString.call (someVar) === Object.prototype.toString.call ([]) hoặc thực hiện một chức năng thuận tiện để có được loại nếu bạn don không muốn gõ Object.prototype.toString.call - Pramod
Wow. Phương pháp concat là một con chuột bị bệnh. Tôi sẽ cung cấp +2 nhưng không được phép - Dark Star1
Tôi sử dụng vanilla Array.isArray hoạt động trong 'trình duyệt hiện đại' (tức là, IE9 + và mọi người khác). Và đối với hỗ trợ trình duyệt cũ, hãy sử dụng shim từ MDN developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - David Gilbertson
Sống trong thế giới hiện đại - Array.isArray(obj) - mcfedr


Trước tiên tôi sẽ kiểm tra xem việc triển khai của bạn có hỗ trợ không isArray:

if (Array.isArray)
    return Array.isArray(v);

Bạn cũng có thể thử sử dụng instanceof nhà điều hành

v instanceof Array

1225
2018-01-23 18:55



1 cho instanceof Array. AFAICT đơn giản nhất - Tom Auger
v instanceof Array sẽ trả về false nếu v đã được tạo trong một khung khác (v là trường hợp của thatFrame.contentWindow.Array lớp học). - pepkin88
Để cụ thể: Array.isArray được định nghĩa là một phần của ECMAScript 5 / Javascript 1.8.5. - jevon
Giải pháp thực sự đơn giản và gọn gàng NHƯNG isArray không tương thích với một số trình duyệt cũ hơn (e.x. IE7 và IE8). Nguồn: kangax.github.io/es5-compat-table/# - Wookie88
Làm thế nào về: if (Array.isArray) trả về Array.isArray (v); khác trả về v instanceof Array; - lewdev


jQuery cũng cung cấp một $.isArray() phương pháp:

var a = ["A", "AA", "AAA"];

if($.isArray(a)) {
  alert("a is an array!");
} else {
  alert("a is not an array!");
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


283
2018-04-02 12:15



Như một tài liệu tham khảo: api.jquery.com/jQuery.isArray - Akseli Palén
Chỉ cần một lưu ý, jQuery sử dụng phương thức toString nội bộ: Nguồn GitHub - Jacob Squires
@ JacobSquires nó phụ thuộc. Tôi vừa mới thử nghiệm ở đây, jQuery mới nhất trên Chrome - $.isArray === Array.isArray đang trở về sự thật. - Renan
@Renan: Đây là điều tốt về việc sử dụng jQuery. Nó thường sử dụng phương pháp hiện đại nhất và tốt nhất để làm điều đó, và bạn không phải làm tất cả các tính năng kiểm tra chính mình để biết những gì để sử dụng. - awe
Nhưng không ai sẽ sử dụng jQuery JUST FOR chức năng này, đúng không? Tôi sẽ không chỉ tải về jquery bởi vì tôi muốn kiểm tra nếu một cái gì đó là một mảng: p - Automagisch


Đây là phương thức nhanh nhất trong số tất cả các phương thức (tất cả các trình duyệt đều được hỗ trợ):

function isArray(obj){
    return !!obj && obj.constructor === Array;
}

84
2017-12-06 10:12



Bạn nói đúng, đó là nhanh nhất theo các bài kiểm tra tôi đưa vào câu hỏi. - mpen
Có bất kỳ nhược điểm nào khi sử dụng phương pháp này không? Nó có vẻ đơn giản và hiệu quả hơn câu trả lời hàng đầu được chấp nhận. - David Meza
@shinobi - chỉ tò mò (và tôi đã thấy điều này thường xuyên) - tại sao bạn cụm từ điều kiện if (obj && Array === obj.constructor) như trái ngược với if (obj && obj.constructor === Array) ? Liệu nó có bị mất trong bản dịch sang tiếng Anh, sau đó là viết mã? ví dụ, người nói tiếng Anh thường có xu hướng hỏi "hiện các đối tượng tồn tại, và không constructor đến từ lớp mảng?", Vì vậy, dòng chảy mã khi đọc nó là hợp lý hơn. hoặc có một số lý do kỹ thuật? - unsynchronized
function object_type(o){var t = typeof(o);return ((t==="object") && (o.constructor===Array)) ? "array" : t;} /*allows you to */ switch(object_type(o)){ case 'array': break; case 'object' : o.dosomething();} - unsynchronized
@shinobi tất cả đều tốt. tôi cho rằng nó có thể là một nôn nao từ một thói quen an toàn c - nếu bạn vô tình sử dụng = thay vì ==, nó sẽ không biên dịch vì nó không phải là một biến có thể gán. - unsynchronized


Array.isArray hoạt động nhanh, nhưng nó không được hỗ trợ bởi tất cả các phiên bản của trình duyệt. Vì vậy, bạn có thể tạo ngoại lệ cho người khác và sử dụng phương pháp phổ quát:

    Utils = {};    
    Utils.isArray = ('isArray' in Array) ? 
        Array.isArray : 
        function (value) {
            return Object.prototype.toString.call(value) === '[object Array]';
        }

31
2017-12-10 17:01



Bạn có thể muốn thêm giải thích về mã để dễ hiểu hơn cho người dùng khác, nhưng nếu không - tốt. +1 - Jeff
Bạn cần lấy .toString() phương pháp từ Object.prototype. Ngay bây giờ bạn đang sử dụng window.toString(), không giống nhau. - the system
Bạn đúng rồi. window.toString làm tương tự như Object.prototype.toString chỉ trong Chrome. - CruorVult
wow ('isArray' trong mảng). Chưa bao giờ thấy nó trước đây. thks - Ivan Ferrer Villa
isArray không nhanh chút nào. Đây là phương pháp chậm nhất. - jemiloii


Hãy tưởng tượng bạn có mảng này bên dưới:

var arr = [1,2,3,4,5];

Javascript (trình duyệt mới và cũ hơn):

function isArray(arr) {
  return arr.constructor.toString().indexOf("Array") > -1;
}

hoặc là

function isArray(arr) {
  return arr instanceof Array;
}

hoặc là

function isArray(arr) {
  return Object.prototype.toString.call(arr) === '[object Array]';
}

sau đó gọi nó như thế này:

isArray(arr);

Javascript (IE9 +, Ch5 +, FF4 +, Saf5 +, Opera10.5 +)

Array.isArray(arr);

jQuery:

$.isArray(arr);

Góc:

angular.isArray(arr);

Gạch dưới và Lodash:

_.isArray(arr);

29
2017-12-27 13:17





Chức năng đơn giản để kiểm tra điều này:

function isArray(object)
{
    if (object.constructor === Array) return true;
    else return false;
}

20
2017-09-04 17:56



Tôi sẽ giảm xuống một dòng return object.constructor === Array - nhưng bạn có chắc chắn rằng điều này sẽ chỉ trả về true cho mảng? - mpen
Có thể làm điều đó với tất cả các biểu thức boolean. Điều khiển tôi khi tôi thấy if(x) return true; else return false :-) Ngay cả khi ngược lại, bạn nên phủ nhận biểu thức. - mpen
Lý do này không trả về true cho getElementsByTagName, là do kết quả của hàm đó thực sự là một HTMLCollection chứ không phải là một mảng. - Yuval A.
Điều này không thành công nếu đối tượng là undefined hoặc null. - John Henckel
@JohnHenckel Xem câu trả lời của tôi stackoverflow.com/a/29400289/34806 nó đưa vào tài khoản cả mối quan tâm của bạn cũng như nhận xét đầu tiên, tất cả trên một dòng - George Jempty


Bạn có thể thử phương pháp này: http://web.archive.org/web/20100424091244/http://www.ajaxdr.com/code/javascript-version-of-phps-is_array-function/

CHỈNH SỬA: Ngoài ra, nếu bạn đã sử dụng JQuery trong dự án của mình, bạn có thể sử dụng chức năng của nó $ .isArray ().


16
2018-01-23 18:56



Nice tìm thấy với các tuyến đường jQuery - vài người trong chúng ta thực sự khám phá sự giàu có của các chức năng ít được sử dụng thường xuyên của nó! - Dav
+1 Tốt tìm! Không biết có một jQuery isArray, điều này sẽ hữu ích khá lâu rồi - William Isted
Trong cách tiếp cận của bạn tất cả các đối tượng có chứa tài sản push sẽ là mảng: is_array({push: true});//true - CruorVult