Πώς να ελέγξετε αν ένα αντικείμενο είναι ένας πίνακας;

Προσπαθώ να γράψω μια συνάρτηση που είτε δέχεται μια λίστα συμβολοσειρών είτε μια απλή συμβολοσειρά. Αν είναι μια συμβολοσειρά, τότε θέλω να τη μετατρέψω σε πίνακα με μόνο ένα στοιχείο. Στη συνέχεια, μπορώ να κάνω βρόχο πάνω από αυτό χωρίς να φοβάμαι για σφάλμα.

Πώς μπορώ λοιπόν να ελέγξω αν η μεταβλητή είναι πίνακας;


Συγκέντρωσα τις διάφορες λύσεις παρακάτω και δημιούργησα ένα jsperf test.

Η μέθοδος που δίνεται στο πρότυπο ECMAScript για την εύρεση της κλάσης του Object είναι η χρήση της μεθόδου toString από το Object.prototype.

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

Ή θα μπορούσατε να χρησιμοποιήσετε την typeof για να ελέγξετε αν είναι String:

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

Ή αν δεν σας ενδιαφέρει η απόδοση, μπορείτε απλά να κάνετε μια concat σε ένα νέο κενό Array.

someVar = [].concat( someVar );

Υπάρχει επίσης ο κατασκευαστής, τον οποίο μπορείτε να ρωτήσετε απευθείας:

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

Δείτε μια διεξοδική επεξεργασία από το @T.J. Crowder's blog, όπως δημοσιεύτηκε στο σχόλιό του παρακάτω.

Ελέγξτε αυτό το benchmark για να πάρετε μια ιδέα για το ποια μέθοδος αποδίδει καλύτερα: http://jsben.ch/#/QgYAV

Από τον @Bharath μετατρέψτε συμβολοσειρά σε πίνακα χρησιμοποιώντας το Es6 για την ερώτηση που τέθηκε:

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

υποθέτουμε:

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']
Σχόλια (29)

Θα ήθελα πρώτα να ελέγξω αν η υλοποίησή σας υποστηρίζει το isArray:

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

Θα μπορούσατε επίσης να δοκιμάσετε να χρησιμοποιήσετε τον τελεστή instanceof.

v instanceof Array
Σχόλια (11)

Αν τα μόνα δύο είδη τιμών που θα μπορούσαν να περάσουν σε αυτή τη συνάρτηση είναι ένα αλφαριθμητικό ή ένας πίνακας αλφαριθμητικών, κρατήστε το απλό και χρησιμοποιήστε έναν έλεγχο typeof για την πιθανότητα αλφαριθμητικού:

function someFunc(arg) {
    var arr = (typeof arg == "string") ? [arg] : arg;
}
Σχόλια (1)