2016-08-01 15 views
-3

Ich habe ein Objekt, das aus einer Datenbank Aufruf in folgendem Format erstellt wird:Javascript/jQuery undefined Objektlänge

Object { group1={...}, same=null, group2=null} 

enter image description here

Ich versuche, die Anzahl der Elemente in Gruppe 1 zu bekommen, Gruppe2, und gleich.

ich zugegriffen es über die Konsole wie folgt:

dataObj.group1.length 

Im Bild oben, diese undefined zurück. Wenn ich jedoch mehr als ein Element in group1 habe, gibt es die Zählung in Ordnung zurück. Es scheint nur Probleme zu verursachen, wenn ein einzelnes Objekt im Objekt/Array vorhanden ist.

Gibt es eine Funktion, die verwendet werden kann, um diese Möglichkeiten zu berücksichtigen und die length der Objekte in diesen Objekten zurückgeben?

Update:

Dies ist, wie ich meine Daten erschaffe:

success: function(data) { 

     // Define our data response 
     var d = data.data; 

     // Push our data to an object 
     dataObj = { 
      same: (d.same ? d.same.tools : null), 
      group1: (d.group1 ? d.group1.tools : null), 
      group2: (d.group2 ? d.group2.tools : null) 
     } 

     // Render our table 
     renderCompare(); 
    } 

Von hier versuche ich, die Menge des Artikels in same, group1, group2 zu bekommen.

Dies ist ein Beispiel für mehr als ein Element in der Antwort. Ich bin in der Lage, unter Verwendung dataObj.group1.length darauf zuzugreifen, und es gibt 2 zurück, die richtig ist. Alles was ich versuche herauszufinden, wie man damit umgeht, gibt es nur 1 Ergebnis. enter image description here

+0

Ich bin verwirrt durch die Frage. Suchen Sie nach einer Möglichkeit, die Anzahl der Eigenschaften im Objekt zu zählen? – stackoverfloweth

+1

Objekte haben keine Länge, also sollten Sie 'undefined' erhalten, unabhängig davon, wie viele Eigenschaften group1 hat, 1 oder anders. – Archer

+0

@Archer Warum würde das funktionieren, wenn es zwei Elemente in der Gruppe1 gibt und dann ein einzelnes Objekt? – SBB

Antwort

2

Nachdem mir die Frage richtig erklärt wurde, nachdem sich mein Kopf in einen Holzklotz verwandelt hat, ist es nur ein Fall von Eventualitäten. Wie @KevinB richtig sagt, sollten Sie die Antwortdaten wirklich bereinigen, so dass immer ein Array von Objekten zurückgegeben wird, auch wenn nur ein Objekt oder gar keine Objekte darin enthalten sind. Das verursacht dein Problem.

Wenn Sie diese Antwort erhalten ...

{ 
    group1: { tool: 244, toolName: "blueprint" }, 
    group2: null, 
    same: null 
} 

dann group1 ist ein Objekt, kein Array, so hat daher keine length Eigenschaft. Wenn aber, Sie haben diese Antwort stattdessen ...

{ 
    group1: [{ tool: 244, toolName: "blueprint" }], 
    group2: null, 
    same: null 
} 

dann würde group1 halten exakt die gleichen Daten, aber würde ein Array sein und daher eine length Eigenschaft.

Was würde ich vorschlagen, ist eine einfache Funktion, die Objekte und gibt die erwartete Antwort, wie dies zu bewerten ...

function getLength(obj) { 
    if (obj == null) return 0; 
    if (obj.length == undefined) return 1; 
    return obj.length; 
} 

In Ihrem Beispiel würden Sie getLength(dataObj.group1) verwenden und es wäre 1. zurückkehren Es wäre Geben Sie 0 zurück, wenn es null war, und geben Sie die tatsächliche Länge zurück, wenn es sich um ein Array handelte.

+0

Tut mir leid, dass ich in meiner anfänglichen Frage sehr verwirrend und vage war. Ich rannte gegen die Uhr vor einem Meeting und wusste nicht, dass ich es so offen zum Raten ließ. Ich habe die vorgeschlagene Funktion in Ihrem Beispiel verwendet, bis ich die Struktur der Antwort ändern kann. Es hat perfekt funktioniert und ich schätze Ihre Zeit und die gute schriftliche Antwort. Ich werde von Anfang an dafür sorgen, bessere Fragen zu stellen. – SBB

+2

Keine Sorge. Es war mein Fehler und ich konnte die Frage nicht anders lesen, bis es endlich geklickt hat. Froh, dass wir helfen können :) – Archer