Làm thế nào để kiểm tra nếu một đối tượng là một mảng?


2753

Tôi đang cố gắng viết một hàm chấp nhận danh sách các chuỗi hoặc một chuỗi. 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, vì vậy tôi có thể lặp qua chuỗi mà không sợ lỗi.

Vì vậy, làm thế nào để tôi kiểm tra nếu biến là một mảng?


Tôi đã làm tròn các giải pháp khác nhau bên dưới và tạo ra một bài kiểm tra jsperf . Tất cả đều nhanh, vì vậy chỉ cần sử dụng Array.isArray- hiện được hỗ trợ tốthoạt động trên các khung .


6
Tôi nghĩ bạn có nghĩa là 'kiểm tra xem đối tượng là một mảng', nhưng bạn muốn kiểm tra xem 'đối tượng là một chuỗi các chuỗi hay một chuỗi' cụ thể. 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ư thế này ... tôi có phải là người thiếu thứ gì đó ở đây không?
rr1g0

149
TL; DR - arr.constructor === Arraylà nhanh nhất.
Neta

3
jsben.ch/#/QgYAV - điểm chuẩn cho những cách phổ biến nhất
EscapeNetscape

39
TL; DR - Mảng. isArray (mảng) kể từ ES5; và $. isArray (mảng) trong jQuery.
Ondra ižka

6
Hãy nhớ rằng nếu bạn vì bất kỳ lý do nào, hãy ghi đè lên hàm tạo của bạn thông qua nguyên mẫu thử nghiệm đó arr.constructor === Arraysẽ trả về false. Array.isArray(arr)mặc dù vẫn trả về đúng
ghaschel

Câu trả lời:


979

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 vào như 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 $.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ải phát hiện các mảng được tạo trong các khung khác nhau, bạn cũng có thể chỉ cần sử dụng instanceof

obj instanceof Array

9
Dưới đây là danh sách đầy đủ hơn các trình duyệt hỗ trợArray.isArray
lightwitch05

if (typeof Array.isArray === 'undefined') {có thể được đổi thànhif(!Array.isArray) {
iMatoria

Đối với những gì nó Object.prototype.string.call(obj)có giá trị có thể bị giả mạo nếu đối tượng có Symbol.toStringTagtrên đó. Điều đó nói rằng tôi không biết bất kỳ môi trường nào tàu Symbol.toStringTagnhưng không Array.isArrayvì vậy điều này có vẻ an toàn.
Benjamin Gruenbaum

5
Tại sao không thành instanceof Arraycông nếu mảng là từ một khung khác nhau?
NobleUplift

16
@NobleUplift: instanceof Arraythất bại nếu mảng đến từ một khung khác nhau vì mỗi mảng từ khung khác nhau đó có một hàm Arraytạo và nguyên mẫu khác nhau . Vì lý do tương thích / bảo mật, mỗi khung hình có môi trường toàn cầu riêng và điều này bao gồm các đối tượng toàn cầu. Toàn Objectcầu từ một khung khác với Objecttoàn cầu từ khung khác. Vì vậy, quá cho toàn cầu Array. Axel Rauschmayer nói nhiều hơn về điều này .
jschoi

1943

Phương thức được đưa ra trong tiêu chuẩn ECMAScript để tìm lớp Object là sử dụng toStringphương thức 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 đó là Chuỗi:

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

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

someVar = [].concat( someVar );

Ngoài ra còn có hàm tạo mà bạn có thể truy vấn trực tiếp:

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

Kiểm tra một điều trị triệt để từ blog của @TJ Crowder , như được đăng trong bình luận của anh ấy bên dưới.

Kiểm tra điểm chuẩn này để có ý tưởng 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 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']

65
+1 Yup, toStringlà một trong những cách để đi. Tôi làm một chút về một cuộc thảo luận ở đây: blog.niftysnippets.org/2010/09/say-what.html
TJ Crowder

3
typeof new String('beans') > 'đối tượng'
Ben

16
Nếu bạn không muốn nhập "[mảng đối tượng]", hãy sử dụng Object.prototype.toString.call (someVar) === Object.prototype.toString.call ([]) hoặc tạo một hàm tiện lợi để lấy loại nếu bạn không 't muốn gõ Object.prototype.toString.call
Pramod

13
Tôi sử dụng vanilla Array.isArray hoạt động trong 'trình duyệt hiện đại' (nghĩa là IE9 + và mọi người khác). Và để 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

21
Sống trong thế giới hiện đại -Array.isArray(obj)
mcfedr

1274

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 instanceoftoán tử

v instanceof Array

127
v instanceof Arraysẽ trả về false nếu vđược tạo trong khung khác ( vlà thể hiện của thatFrame.contentWindow.Arraylớp).
pepkin88

47
Cụ thể: Array.isArrayđược định nghĩa là một phần của ECMAScript 5 / Javascript 1.8.5.
jevon

8
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 (ví dụ IE7 và IE8). Nguồn: kangax.github.io/es5-compat-table/#
Wookie88

2
Làm thế nào về: if (Array.isArray) return Array.isArray (v); khác trả về v instanceof Array;
lewdev

1
hoặc chỉ:return (Array.isArray && Array.isArray(v)) || (v instanceof Array);
Stijn de Witt

298

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

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>


27
Chỉ cần một lưu ý, jQuery sử dụng phương thức toString trong nội bộ: Nguồn GitHub
Jacob Squires

5
@JacobSquires nó phụ thuộc. Tôi mới thử nghiệm ở đây, jQuery mới nhất trên Chrome - $.isArray === Array.isArrayđang trở lại đúng.
Renan

3
@Renan: Đây là điều tốt khi sử dụng jQuery. Nó thường sử dụng phương pháp hiện đại nhất và tốt nhất để thực hiện và bạn không cần phải tự kiểm tra tất cả các tính năng để biết nên sử dụng cái gì.
kinh ngạc

jQuery đang sử dụng Array.isArrayđằng sau hậu trường: github.com/jquery/jquery/blob/master/src/core.js#L211
Sergiu

1
Nhưng không ai sẽ sử dụng jQuery JUST FOR chức năng này, phải không? Tôi sẽ không tải xuống jquery vì tôi muốn kiểm tra xem có thứ gì đó là một mảng không: p
Automagisch

106

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

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

2
Bạn nói đúng, đó là cách nhanh nhất theo các bài kiểm tra tôi đưa vào câu hỏi.
mở

5
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 nhiều so với 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 lại diễn đạt điều kiện if (obj && Array === obj.constructor)trái ngược với if (obj && obj.constructor === Array)? Có phải là một mất trong dịch sang tiếng Anh, sau đó để mã điều? ví dụ, người nói tiếng Anh thường có xu hướng hỏi "đối tượng có tồn tại không, và hàm tạo của nó có đến từ lớp mảng không?", vì vậy dòng mã khi đọc nó hợp lý hơn. hoặc có một số lý do kỹ thuật?
không đồng bộ

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();}
không đồng bộ

3
@shinobi tất cả đều tốt. tôi cho rằng nó có thể là một sự nôn nao từ một thói quen c an toàn - nếu bạn vô tình sử dụng = thay vào đó ==, nó sẽ không biên dịch vì nó không phải là một biến có thể gán được.
không đồng bộ

47

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 cạnh:

angular.isArray(arr);

Gạch dưới và gạch ngang:

_.isArray(arr);

34

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 trình duyệt. Vì vậy, bạn có thể tạo một 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]';
        }

3
Bạn cần phải có được .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.
hệ thống

Bạn đúng rồi. window.toStringlàm tương tự như Object.prototype.toStringtrong Chrome.
CruorVult

isArray không nhanh chút nào. Đây là phương pháp chậm nhất.
jemiloii

Tại sao không chỉ thêm nó vào Array chứ không phải Utils? (Tôi biết bạn không muốn có các thuộc tính bổ sung trên các đối tượng mảng mới nhưng tôi nghĩ điều đó chỉ xảy ra nếu bạn thêm isArray vào Array.prototype.)
David Winiecki 13/12/14

27

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

function isArray(object)
{
    return object.constructor === Array;
}

16
Tôi sẽ giảm nó 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ề đúng cho các mảng không?
mở

12
Có thể làm điều đó với tất cả các biểu thức boolean. Ổ đĩa cho tôi khi tôi thấy if(x) return true; else return false:-) Ngay cả khi nó ngược, bạn nên phủ nhận biểu thức.
mở

3
Lý do điều này không trả về đúng cho getElementsByTagName, là vì 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.

6
Điều này thất bại nặng nề nếu đối tượng không xác định hoặc null.
John Henckel

1
@JohnHenckel Xem câu trả lời của tôi stackoverflow.com/a/29400289 432806 nó có tính đế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
Dexygen

17

Như MDN nói ở đây :

sử dụng Array.isArray hoặc Object.prototype.toString.call để phân biệt các đối tượng thông thường với các mảng

Như thế này:

  • Object.prototype.toString.call(arr) === '[object Array]', hoặc là

  • Array.isArray(arr)


17

Chỉ có một giải pháp cho câu hỏi này

x instanceof Array

Trong đó x là biến nó sẽ trả về true nếu x là mảng và false nếu không.


Sạch sẽ hơn nhiều và tương lai an toàn! Điều này hoặc một typeofso sánh.
ChristoKiwi

Đây có phải là một cái gì đó nhận được một lượng hỗ trợ trình duyệt tốt? Tôi thích nó.
Dan Zuzevich

1
Thật không may, điều này thực sự không hữu ích nếu không thử / bắt vì nếu "x" là một đối tượng như {}mảng, thì bạn sẽ gặp lỗi cú pháp.
abalter

15

Bạn có thể kiểm tra loại biến của mình xem nó có phải là mảng không;

var myArray=[];

if(myArray instanceof Array)
{
....
}

1
Một vài người đã đề cập instanceof.. Tôi nghĩ rằng nó thất bại trong một vài tình huống kỳ lạ.
mở

15

Tôi sẽ tạo một hàm để kiểm tra loại đối tượng bạn đang xử lý ...

function whatAmI(me){ return Object.prototype.toString.call(me).split(/\W/)[2]; }

// tests
console.log(
  whatAmI(["aiming","@"]),
  whatAmI({living:4,breathing:4}),
  whatAmI(function(ing){ return ing+" to the global window" }),
  whatAmI("going to do with you?")
);

// output: Array Object Function String

sau đó bạn có thể viết một câu lệnh if đơn giản ...

if(whatAmI(myVar) === "Array"){
    // do array stuff
} else { // could also check `if(whatAmI(myVar) === "String")` here to be sure
    // do string stuff
}

12

Tôi làm điều này một cách rất đơn giản. Làm việc cho tôi. Bất kỳ nhược điểm?

Array.prototype.isArray = true;

a=[]; b={};
a.isArray  // true
b.isArray  // (undefined -> false)

7
bị lừa bởi{isArray:true}
Bergi

JSON.parse(someDataFromElsewhere).items.isArraycó thể trả về true (tùy thuộc vào dữ liệu) và phá mã của bạn.
Roy Tinker

12

Đây là nỗ lực của tôi để cải thiện câu trả lời này có tính đến các ý kiến:

var isArray = myArray && myArray.constructor === Array;

Nó được loại bỏ if / other và tính đến khả năng của mảng là null hoặc không xác định


constructor không khả dụng trong ES5
TechTurtle


11

Tôi đã cập nhật fiddle jsperf với hai phương pháp thay thế cũng như kiểm tra lỗi.

Nó chỉ ra rằng phương thức xác định một giá trị không đổi trong các nguyên mẫu 'Đối tượng' và 'Mảng' nhanh hơn bất kỳ phương thức nào khác. Đó là một kết quả hơi ngạc nhiên.

/* Initialisation */
Object.prototype.isArray = function() {
  return false;
};
Array.prototype.isArray = function() {
  return true;
};
Object.prototype._isArray = false;
Array.prototype._isArray = true;

var arr = ["1", "2"];
var noarr = "1";

/* Method 1 (function) */
if (arr.isArray()) document.write("arr is an array according to function<br/>");
if (!noarr.isArray()) document.write("noarr is not an array according to function<br/>");
/* Method 2 (value) - **** FASTEST ***** */
if (arr._isArray) document.write("arr is an array according to member value<br/>");
if (!noarr._isArray) document.write("noarr is not an array according to member value<br/>");

Hai phương thức này không hoạt động nếu biến lấy giá trị không xác định, nhưng chúng hoạt động nếu bạn chắc chắn rằng chúng có giá trị. Liên quan đến việc kiểm tra hiệu năng trong đầu nếu một giá trị là một mảng hoặc một giá trị duy nhất, phương thức thứ hai trông giống như một phương thức nhanh hợp lệ. Nó nhanh hơn một chút so với 'thể hiện' trên Chrome, nhanh gấp đôi so với phương pháp tốt thứ hai trong Internet Explorer, Opera và Safari (trên máy của tôi).


9

Tôi biết rằng mọi người đang tìm kiếm một cách tiếp cận javascript thô. Nhưng nếu bạn muốn suy nghĩ ít hơn, hãy xem tại đây: http://underscorejs.org/#isArray

_.isArray(object) 

Trả về true nếu đối tượng là một mảng.

(function(){ return _.isArray(arguments); })();
=> false
_.isArray([1,2,3]);
=> true

7
"Trừ khi một thẻ khác cho khung / thư viện cũng được bao gồm, một câu trả lời JavaScript thuần túy được mong đợi."
Michał Perłakowski

5

Giải pháp tốt nhất tôi từng thấy là thay thế trình duyệt chéo cho typeof. Kiểm tra giải pháp của Angus Croll tại đây .

Phiên bản TL; DR bên dưới, nhưng bài viết là một cuộc thảo luận tuyệt vời về vấn đề này vì vậy bạn nên đọc nó nếu bạn có thời gian.

Object.toType = function(obj) {
    return ({}).toString.call(obj).match(/\s([a-z|A-Z]+)/)[1].toLowerCase();
}
// ... and usage:
Object.toType([1,2,3]); //"array" (all browsers)

// or to test...
var shouldBeAnArray = [1,2,3];
if(Object.toType(shouldBeAnArray) === 'array'){/* do stuff */};

5

Đây là cách tiếp cận lười biếng của tôi:

if (Array.prototype.array_ === undefined) {
  Array.prototype.array_ = true;
}

// ...

var test = [],
    wat = {};

console.log(test.array_ === true); // true
console.log(wat.array_ === true);  // false

Tôi biết đó là đặc quyền để "gây rối" với nguyên mẫu, nhưng nó dường như hoạt động tốt hơn đáng kể so với toStringphương pháp được đề xuất .

Lưu ý: Một điều đáng tiếc của phương pháp này là nó không hoạt động xuyên qua các iframeranh giới , nhưng đối với trường hợp sử dụng của tôi thì đây không phải là vấn đề.


nó không tốt hơn về mặt hiệu năng nữa, ít nhất là trên FF30 trên Ubuntu 64-bit
test30

2
bị lừa bởi wat = {array_: true}đồ vật.
Bergi

@Bergi: Vâng, điều đó nên rõ ràng. Nếu bạn đang thiết lập obj.array_ = true, thì bạn chỉ đang tự lừa dối chính mình .
namuol

@namuol: Tôi không nhất thiết phải tự lừa mình. Thông thường đủ các đối tượng được sử dụng như từ điển. Hãy nghĩ về một cacheđối tượng để ghi nhớ các kết quả tìm kiếm sử dụng các chuỗi tìm kiếm làm khóa thuộc tính. Nếu người dùng tìm kiếm array_thì sao? Có phải đối tượng của bạn trở thành một mảng vì điều đó? Nó chỉ là một lỗi.
Bergi

@namuol: Ngoài ra, cách tiếp cận này sẽ yêu cầu tất cả các bên liên quan (bao gồm các thư viện đã sử dụng) có thể đồng ý .array_sử dụng để gắn thẻ mảng. Đó thực sự không phải là trường hợp ở đây, .arraycó thể có nghĩa là bất cứ điều gì. Ít nhất bạn nên sử dụng một chuỗi mô tả và báo hiệu sự không phù hợp của việc sử dụng tùy ý, ví dụ như với .__isArray = true.
Bergi 8/8/2015

5

Có một ví dụ hay trong cuốn sách Các mẫu JavaScript của Stoyan Stefanov , giả sử để xử lý tất cả các vấn đề có thể xảy ra cũng như sử dụng phương thức ECMAScript 5 Array.isArray () .

Vì vậy, đây là:

if (typeof Array.isArray === "undefined") {
    Array.isArray = function (arg) {
        return Object.prototype.toString.call(arg) === "[object Array]";
    };
}

Nhân tiện, nếu bạn đang sử dụng jQuery, bạn có thể sử dụng phương thức $ .isArray ()


2
+1: tại sao không chỉ đơn giản if(!Array.isArray) {...?
Marco Demaio

5

Cách dễ nhất và nhanh nhất để kiểm tra xem Object có phải là Mảng hay không.

 var arr = [];
  arr.constructor.name ==='Array'  //return true;

hoặc là

arr.constructor ===Array //return true;

hoặc bạn có thể tạo một chức năng tiện ích:

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

sử dụng:

isArray(arr); //return true

5

Những điều sau đây có thể được sử dụng nếu bạn biết rằng đối tượng của bạn không có phương thức concat.

var arr = [];
if (typeof arr.concat === 'function') {
    console.log("It's an array");
}


Đây là một mẹo hay, nhưng có thể bị ghi đè ... nhưng hầu hết mọi lúc sẽ nhận được kết quả
Alireza

5

Bạn có thể là phương thức isArray nhưng tôi muốn kiểm tra với

Object.getPrototypeOf(yourvariable) === Array.prototype


Tại sao bạn thích điều này?
mở

@mpen Object.getPrototypeOf(yourvariable)nó trả về nguyên mẫu của một đối tượng Array. Và mã là nhanh nhất và an toàn để dựa vào.
THÉP

1
Thật dễ dàng để bỏ qua: pastebin.com/MP8d5bCE Ngoài ra, bạn có kiểm tra hiệu suất để sao lưu yêu cầu "nhanh nhất" của mình không?
mở

4

Nếu hai loại giá trị duy nhất có thể được truyền cho hàm này là một chuỗi hoặc một chuỗi các chuỗi, hãy giữ cho nó đơn giản và sử dụng typeofkiểm tra khả năng của chuỗi:

function someFunc(arg) {
    var arr = (typeof arg == "string") ? [arg] : arg;
}

Vâng ... điều đó sẽ làm việc cho kịch bản này, nhưng không nói chung. Đã kết thúc bằng cách sử dụng varargs anyway. :)
mở

4
A = [1,2,3]
console.log(A.map==[].map)

Trong tìm kiếm phiên bản ngắn nhất ở đây là những gì tôi đã nhận được cho đến nay.

Lưu ý, không có chức năng hoàn hảo sẽ luôn phát hiện tất cả các kết hợp có thể. Tốt hơn là nên biết tất cả các khả năng và giới hạn của các công cụ của bạn hơn là mong đợi một công cụ ma thuật.


1
dẫn xuất nhẹ của tôi A.map !== undefinednhưng vâng, đó có thể là con đường trơn tru trong thế giới của những người

FYI: Điều này không hoạt động trên iFrames ( stackoverflow.com/questions/460256/NH )
WiredPrairi

4
function isArray(value) {
    if (value) {
        if (typeof value === 'object') {
            return (Object.prototype.toString.call(value) == '[object Array]')
        }
    }
    return false;
}

var ar = ["ff","tt"]
alert(isArray(ar))

4

Một hàm đơn giản để kiểm tra nếu một giá trị đầu vào là một mảng như sau:

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

Điều này hoạt động trên trình duyệt chéo, và với các trình duyệt cũ hơn. Điều này được lấy từ bài đăng trên blog của TJ Crowder


4

Bạn có thể thử điều này:

var arr = []; (or) arr = new Array();
var obj = {}; (or) arr = new Object();

arr.constructor.prototype.hasOwnProperty('push') //true

obj.constructor.prototype.hasOwnProperty('push') // false

4

Hàm này sẽ biến hầu hết mọi thứ thành một mảng:

function arr(x) {
    if(x === null || x === undefined) {
        return [];
    }
    if(Array.isArray(x)) {
        return x;
    }
    if(isString(x) || isNumber(x)) {
        return [x];
    }
    if(x[Symbol.iterator] !== undefined || x.length !== undefined) {
        return Array.from(x);
    }
    return [x];
}

function isString(x) {
    return Object.prototype.toString.call(x) === "[object String]"
}

function isNumber(x) {
    return Object.prototype.toString.call(x) === "[object Number]"
}

Nó sử dụng một số tính năng mới hơn của trình duyệt, do đó bạn có thể muốn điền vào phần này để được hỗ trợ tối đa.

Ví dụ:

> arr(null);
[]
> arr(undefined)
[]
> arr(3.14)
[ 3.14 ]
> arr(1/0)
[ Infinity ]
> gen = function*() { yield 1; yield 2; yield 3; }
[Function: gen]
> arr(gen())
[ 1, 2, 3 ]
> arr([4,5,6])
[ 4, 5, 6 ]
> arr("foo")
[ 'foo' ]

Các chuỗi NB sẽ được chuyển đổi thành một mảng với một phần tử duy nhất thay vì một mảng ký tự. XóaisString kiểm tra nếu bạn muốn nó theo cách khác.

Tôi đã sử dụng Array.isArrayở đây vì nó mạnh mẽ nhất và cũng đơn giản nhất.


4

Trong trường hợp của bạn, bạn có thể sử dụng concatphương thức Array có thể chấp nhận các đối tượng đơn lẻ cũng như mảng (và thậm chí kết hợp):

function myFunc(stringOrArray)
{
  var arr = [].concat(stringOrArray);

  console.log(arr);

  arr.forEach(function(item, i)
  {
    console.log(i, "=", item);
  })
}

myFunc("one string");

myFunc(["one string", "second", "third"]);

concat dường như là một trong những phương thức lâu đời nhất của Array (ngay cả IE 5.5 cũng biết rõ về nó).

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.