2017-10-07 1 views
1

Ich habe eine Web-App, die Ihre Einkäufe verfolgt und verschiedene Statistiken anzeigt. Auf einer der Seiten habe ich jQuery ajax Anfragen, die Einkäufe eines Benutzers von einem API-Aufruf laden. Dann werden alle Käufe als JavaScript-Objekte in ein globales Array namens G_PURCHASES gelegt.JavaScript-Funktion Array.prototype.includes() funktioniert nicht in for-Schleife

So weit so gut. Dann rufe ich eine Funktion auf, die jQuerys Deferred() verwendet, um es verkettbar zu machen; Es iteriert G_PURCHASES und erhält alle eindeutigen purchase.item.category 's (sehen Sie sich die relevante Struktur des Kaufobjekts an), indem Sie prüfen, ob G_PURCHASES[i].item.category in einem anderen globalen Array namens G_CATEGORIES mit Array.includes() enthalten ist. Und wenn es nicht ist, dann push() es in G_CATEGORIES.

Der Fehler, den ich mit einem Problem habe, ist, dass auch nach einem category Objekt in das G_CATEGORIES Array geschoben worden, die Array.includes() Prüfung noch false zurückkehrt, jedes Mal. Überprüfen Sie den relevanten Code und geben Sie ihn aus, um ihn zu löschen.

// Relevant structure of the purchase object 
purchase = { 
    item: { 
    category: { 
     categoryID: int, 
     name: string 
    } 
} 


// Relevant code 

var G_PURCHASES = []; // array declared globally 
// it is successfully filled with @purchase objects from another function 

var G_CATEGORIES = []; // array declared globally 
// to be filled by @LoadAllCategories 

var LoadAllCategories = function() { 

    // make a jQuery Deffered 
    let func = $.Deferred(function() { 

    let allP = G_PURCHASES; // make a shortcut 
    let allC = C_CATEGORIES; // make another shortcut 
    for (var i = 0; i < allP.length; i++) { 

     // get whether the current purchase.item.category 
     // already exists in allC array 
     let exist = allC.includes(allP[i].item.category); 

     // console.log the above result 
     console.log('i = ' + i + ', category exists = ' + exist); 

     // if it doesn't exist then push it in 
     if (!exist) allC.push(allP[i].item.category); 
    } 

    this.resolve(); 

    }); 

    return func; 
} 


// Input 
G_PURCHASES has 6 @purchase objects with 3 unique item.category 'ies 

// Output 
i = 0, category exists = false 
i = 1, category exists = false 
i = 2, category exists = false 
i = 3, category exists = false 
i = 4, category exists = false 
i = 5, category exists = false 

// Result 
G_CATEGORIES contains duplicate categories 

Ich versuchte Array.indexOf() und jQuery $.inArray() ohne Erfolg zu nutzen. Egal, was ich console.log() Ich kann nicht scheinen, wo der Fehler liegt. Also, wenn Sie mir sagen können, warum Array.includes() nicht funktioniert innerhalb dieser for Schleife werde ich Sie finden und ich werde Ihnen ein Bier kaufen!

+0

Warum nicht 'console.log (allC, allP [i])' und sehen, was Sie haben. – adeneo

+0

Ich bekomme ein Array und ein Objekt, genau wie erwartet: 'Array [] Objekt {Objekt: Objekt}' 'Array [Objekt] Objekt {Objekt: Objekt}' 'Array [Objekt, Objekt] Objekt {Objekt: Objekt} 'und so weiter –

Antwort

3

Gut enthält überprüft für referenzielle Gleichheit, so kann es zwei Objekte mit denselben Eigenschaften und Werten geben, aber sie sind immer noch verschiedene Objekte, daher ist ihre Referenz nicht gleich. Wahrscheinlich möchten Sie jedes Kategorieobjekt auf seine Kategorie-ID und seinen Namen überprüfen, um Dubletten zu finden.

+0

Eine einfache sekundäre Schleife, die das Kategorien-Array iteriert und nach Kategorie-ID-Übereinstimmung sucht, hat alles repariert! Vielen Dank! –

Verwandte Themen