2008-10-20 5 views

Antwort

106

Moderne Browser unterstützen die Array.isArray(obj) Methode.

See MDN für die Dokumentation und eine Polyfill.

= ursprüngliche Antwort von 2008 =

können Sie die Konstruktor Eigenschaft Ihrer Ausgabe verwenden:

if(output.constructor == Array){ 
} 
else if(output.constructor == Object){ 
} 
+2

Dies hat das Potenzial von Konflikten zwischen verschiedenen Seiten, da beide unterschiedliche Instanzen der Konstruktoren "Array" und "Object" haben, die nicht als gleichwertig verglichen werden. Ich bin mir nicht ganz sicher, wie ich ein Beispiel erstellen soll, das dies demonstriert, aber ich habe es irgendwo gelesen. – ripper234

+1

@ ripper234 Das Problem manifestiert sich in einer Multifensterumgebung. – alex

+2

+1 für metioning Array.isArray. Überprüfen Sie diesen Link für borwser Unterstützung: http://kangax.github.io/compat-table/es5/#Array.isArray – SKuijers

25

Ist Objekt:

function isObject (obj) { 
    return obj && (typeof obj === "object"); 
} 

Array:

function isArray (obj) { 
    return isObject(obj) && (obj instanceof Array); 
} 

Da Arrays sind Objekte, die Sie testen wollen, werden, wenn eine Variable ein Array erste ist, und dann, wenn es eine Aufgabe:

if (isArray(myObject)) { 
    // do stuff for arrays 
} 
else if (isObject(myObject)) { 
    // do stuff for objects 
} 
+0

Gute Antwort. Vielleicht möchten Sie hinzufügen, dass jedes js-Objekt als Hash behandelt werden kann. – Rontologist

+0

isObject (new Date())) ist wahr, aber ein Datum ist kein Objekt/Hash im Sinne dieser Frage. Natürlich wenden wir es nur auf JSON an, aber der Methodenname ist dann wirklich verwirrend. – schirrmacher

0

prüfen "Konstruktor" Eigenschaft auf dem Objekt. Es ist Array - es ist ein Array-Objekt.

8

Meinten Sie "Objekt" statt "Hash"?

>>> var a = []; 
>>> var o = {}; 
>>> a instanceof Array 
true 
>>> o instanceof Array 
false 
5

Ich habe eine Funktion zur Bestimmung, ob es ein Wörterbuch ist.

exports.is_dictionary = function (obj) { 
    if(!obj) return false; 
    if(Array.isArray(obj)) return false; 
    if(obj.constructor != Object) return false; 
    return true; 
}; 

// return true 
test.equal(nsa_utils.is_dictionary({}), true); 
test.equal(nsa_utils.is_dictionary({abc:123, def:456}), true); 

// returns false 
test.equal(nsa_utils.is_dictionary([]), false); 
test.equal(nsa_utils.is_dictionary([123, 456]), false); 
test.equal(nsa_utils.is_dictionary(null), false); 
test.equal(nsa_utils.is_dictionary(NaN), false); 
test.equal(nsa_utils.is_dictionary('hello'), false); 
test.equal(nsa_utils.is_dictionary(0), false); 
test.equal(nsa_utils.is_dictionary(123), false); 
+0

Danke dafür. Es hat für die oben genannten Fälle funktioniert. Ich muss noch auf einen Fall stoßen, bei dem Ihre Methode fehlschlägt. – Nav

0

Für json Parsen kommen könnte praktisch :)

isArrayHashs = (attr) -> 
    !!attr && attr.constructor == Array && isHash(attr[0]) 

isHash = (attr) -> 
    !!attr && !$.isNumeric(attr) && attr.constructor == Object 

attr [0] .constructor muss sein:

  • String
  • Numerische
  • Array
  • Objekt
  • Undefiniert
Verwandte Themen