2010-07-22 5 views
7

Ich möchte entweder eine Stringliteral passieren zu können,Feststellen, ob ein JavaScript-Objekt ein „Komplex“ Objekt ist oder nur eine Zeichenfolge

'this is a string' 

oder ein JavaScript-Objekt,

{one: 'this', two: 'is', three: 'a', four: 'string' } 

als Argument zu einer Funktion und verschiedene Aktionen abhängig davon, ob es eine Zeichenfolge oder ein Objekt ist. Wie kann ich feststellen, was wahr ist?

Um genauer zu sein, möchte ich über die Eigenschaften eines Objekts iterieren, und einige Parsing tun, wenn eine Eigenschaft eine Zeichenfolge ist, aber rekursiv verschachteln, wenn die Eigenschaft ein Objekt ist. Ich habe herausgefunden, wie man $.each() verwendet, um über die Eigenschaften des Objekts zu iterieren, aber wenn ich dies nur mit der Zeichenfolge mache, behandelt es die Zeichenfolge als ein Array von Buchstaben und nicht als eine einzige Sache. Kann ich das auf andere Weise umgehen?

Antwort

6
var data = { 
    foo: "I'm a string literal", 
    bar: { 
     content: "I'm within an object" 
    }   
}; 

jQuery

$.each(data, function(i, element){ 
    if($.isPlainObject(element){ 
     // we got an object here 
    } 
}); 

Es gibt ähnliche Methoden wie $.isArray() oder $.isFunction() im jQuery lib.

Mutter Javascript

for(var element in data){ 
    if(toString.call(element) === '[object Object]'){ 
     // we got an object here 
    } 
} 

Zur Verwendung der hack'ish Weise mit toString hat den Vorteil, dass Sie erkennen können, ob es sich um really ein Objekt und ein array. Sowohl Objekte als auch Arrays würden object mit typeof element zurückgeben.

Lange Rede, kurzer Sinn, Sie können sich nicht auf den Operator typeof verlassen, um echte objects und arrays zu unterscheiden. Dafür benötigen Sie die toString.call(). Wenn Sie nur wissen müssen, ob es ein Objekt ist oder nicht, typeof ist in Ordnung.

+0

Jeder, der sich fragt, warum ich diese Antwort markiert habe, stimmt eher als einer von denen mit mehr Stimmen: In dieser Antwort gibt es einen Vorschlag, wie ich meine Bedürfnisse mit jQuery erfüllen kann, was bedeutet, dass ich keine schreiben muss Implementierung, um es zu verwenden. Diese Antwort bietet auch gute Optionen zum Abdecken von Funktionen und Arrays. –

2

Versuchen Sie den Operator typeof. Es wird object für Objekte und string für Zeichenfolgen zurückgegeben.

5
var a = 'this is a string'; 

console.log(typeof a); // Displays: "string" 

var b = {one: 'this', two: 'is', three: 'a', four: 'string' }; 

console.log(typeof b); // Displays: "object" 

Deshalb:

if (typeof yourArgument === 'string') { 
    // Do the string parsing 
} 
else if (typeof yourArgument === 'object') { 
    // Do the property enumeration 
} 
else { 
    // Throw exception 
} 

UPDATE:

Einige weitere Überlegungen:

  1. @Andy E's c Siehe weiter unten.

  2. typeof null gibt auch "object" zurück. Dasselbe gilt für jedes andere Objekt, einschließlich Arrays.

+2

+1, weil das OP speziell nach String-Literalen gefragt hat, aber bedenken Sie, dass 'typeof new String (" Hello ") ==" object "'. Um absolut sicher zu sein, benutze 'a.constructor == String'. –

+0

Mit typeof kann man nicht zwischen 'objects' /' arrays' und 'null' unterscheiden. – jAndy

+0

@jAndy: Ja stimmt. Das habe ich in meiner Antwort gesagt. –

4

Versuchen Sie folgendes:

function some_function(argument) { 
    if (typeof(argument) == "string" || argument.constructor == String) { 
    // it's a string literal 
    } else if (argument && typeof(argument) == "object" && argument.constructor != Array) { 
    // it's an object and not null 
    } else { 
    // error 
    } 
} 

Dank Andy E für den tipp mit argument.constructor.

+3

für was ist die down abstimmung? Ich würde mich über einen Kommentar freuen! Ich weiß also, was ich falsch gemacht habe. – jigfox

+0

@Jens F. Ich stimme zu. Gute Antwort. Eine Abstimmung hier unten ist absolut nutzlos. Habe +1 von mir :-) –

+0

das wird fehlschlagen aufrufen 'some_function (null)', da 'typeof (null) === 'object''. – jAndy

1

Sie kann ich hatte ein ähnliches Problem, so etwas wie dieses

function something(variableX){ 
    if (typeof(variableX) === 'object'){ 
    // Do something 
    }else if (typeof(variableX) === 'string'){ 
    // Do something 
    } 

} 
+0

sollten Sie für eine "sonst wenn" gehen ... –

+0

aktualisiert! Dank dafür – AutomatedTester

1

tun, und ich denke, dass ich eine Lösung herausgefunden. Hier ist mein Beispielcode für jeden, der interessiert ist.

var propToDotSyntax = function (obj) { 
    var parse = function (o, n) { 
     var a = [], t; 
     for (var p in o) { 
      if (o.hasOwnProperty(p)) { 
       t = o[p]; 
       if (n !== undefined) tmp = n + '.' + p; 
       else tmp = p; 
       if (t && typeof(t) === 'object') a.push(arguments.callee(t, tmp)); 
       else a.push(tmp + '=' + t); 
      } 
     } 
     return a; 
    }; 
    return parse(obj).toString(); 
} 
var i = { prop: 'string', obj: { subprop: 'substring', subobj: { subsubprop: 'subsubstring' } } }; 

propToDotSyntax(i); 

Dies wird alle Eigenschaften eines Objekts durchlaufen - auch wenn die Eigenschaften Objekte selbst sind - und eine Zeichenfolge mit den folgenden Werten in Punktsyntax zurück.

"prop=string,obj.subprop=substring,obj.subobj.subsubprop=subsubstring" 

Ich habe die Inspiration von DavidPirek.com - Vielen Dank Herr Pirek!

Verwandte Themen