• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[GELÖST] Bedingtes Array Copy

Magier47

New member
Hallo

ich habe eine ziemlich blöde Anfängerfrage.
Ich habe ein Array von Objekten und möchte bedingt einzelnen Objekte in ein neues Array kopieren, nur funzt das nicht.
Ich habe folgenden Code (für die Übersicht gekürzt):
Code:
function F_Sammel(arr_Adressen_In) {
    let arr_Adressen_Out = []; 
    for (i = 0; i < arr_Adressen_In.length ; i++) {
        F_IsThreadInDB(arr_Adressen_In[i].ThreadNr, function(boo_IsInDB){
            if (boo_IsInDB == false) {
                arr_Adressen_Out.push(arr_Adressen_In[i]);                 
            }           
        });        
    }
    console.log("In  : " + arr_Adressen_In);
    console.log("In  : " + arr_Adressen_In.length);
    console.log("Out : " + arr_Adressen_Out);
    console.log("Out : " + arr_Adressen_Out.length);
}
Die Funktion bekommt ein Array (arr_Adressen_In) und soll die Objekte die noch nicht vorhanden sind in 'arr_Adressen_Out' kopieren. Die Funktion F_IsThreadInDB gibt als Callback ein simples True/False zurück.

Die Konsolen Ausgabe sieht so aus.
Code:
In  : [object Object]
In  : 1
Out :
Out : 1
Ich vermute das irgendwas mit dem Push nicht stimmt...verstehe aber nicht so recht wieso.

Die Längen sind gleich aber ich kann im 'arr_Adressen_Out' nicht auf die einzelnen Propertys zugreifen

Code:
TypeError: Cannot set property 'ZielNr' of undefined

Vielleicht könnte mir jemand einen Tipp geben?
MfG
Magier
 
Zuletzt bearbeitet von einem Moderator:
AW: Bedingtest Array Copy

Der Fehlermeldung nach entsteht der Fehler nicht im gezeigten Code. Wo kommt denn die Variable ZielNr vor?
Und zeige mal bitte die function F_IsThreadInDB().
 
Erst mal DANKE für die Antworten!

@Dormilich

Habe mir Array.filter() angesehen. Ist aber glaube ich nicht das richtige, da filter() immer das ganze Array auf einen Wert/Funktion prüft.


@mikdoe

Da muss ich jetzt weit ausholen, dachte eigentlich das sei nicht nötig....
Also mein Objekt sieht so aus.

Code:
var Eintrag = {
           Okay : false,
           OriginalUrl : "www",
           ThreadNr : "0123456",
           Online : true,
           ZielNr : 0,
           Trys404 : 0 
};

Hier F_IsThreadInDB().
Die Funktion F_GetColl() gibt nur eine Verbindung zu einer Collection (MongoDB) zurück.

Sie sucht einfach nur ob ThreadNr (str_ThreadNr) vorhanden ist oder nicht. Wenn sie noch nicht vorhanden ist, soll das Objekt in die DB geschrieben werden. Es ist mein erster Gehversuch mit Java und Mongo, daher bitte ich zu entschuldigen, wenn einige der If/Else Überprüfungen überflüssig sind. Es ist alles noch sehr roh und ich muss noch lernen was z.B. passiert, wenn keine Datenbank vorhanden ist.

Code:
function F_IsThreadInDB(str_ThreadNr, F_Callback) {    
    F_GetColl(Obj_Einstellungen.MongoDB.DbNameThreads,Obj_Einstellungen.MongoDB.CollNameThreads,"IsThreadInDB",function(obj_Coll){
         obj_Coll.find({ThreadNr:str_ThreadNr}).toArray(function(err_Find, result_Find) {
            if (err_Find) {                
                console.log(err_Find);            
                process.exit(-1); 
            }                        
            if (result_Find != undefined) {
                if (result_Find != null) {
                    if (result_Find.lenght > 0) {                        
                        F_Callback(true);                    
                    }
                    else{                        
                        F_Callback(false);
                    }                    
                }
                else{                    
                    F_Callback(false);
                }
            }
            else{                
                F_Callback(false);
            }
        });        
    });
}
Der Fehler, das bitte ich zu entschuldigen ist irreführend. Ich habe ohne nachzudenken angegeben. Sorry. Der Fehler entsteht hier:
Code:
function F_InsertThreads(arr_In,int_PfadNr,F_Callback) {   
    F_GetColl(Obj_Einstellungen.MongoDB.DbNameThreads,Obj_Einstellungen.MongoDB.CollNameThreads,"InsertThreads",function(obj_Coll){
        if (arr_In.length == 1) {
            console.log("1Debug : " + arr_In);
            console.log("2Debug : " + arr_In[0]);
            console.log("3Debug : " + typeof arr_In);
            console.log("4Debug : " + typeof arr_In[0]);
            console.log("5Debug : " + arr_In.length);
            arr_In[0].ZielNr = int_PfadNr;
            delete arr_In.Okay;
            //obj_Coll.insertOne(arr_In[0],function(err_Insert , res){
            //    if (err_Insert) {                    
            //        console.log(err_Insert);
            //        process.exit(-1); 
            //    }
                F_Callback(true);
            });   
        }
        else{
            for (i = 0; i < arr_In.length ; i++) {                
                arr_In[i].ZielNr = int_PfadNr + i;
                delete arr_In[i].Okay;
            }
            //obj_Coll.insertMany(arr_In,function(err_Insert , res){
            //    if (err_Insert) {                    
            //        console.log(err_Insert);
            //        process.exit(-1); 
            //    }
                F_Callback(true);
            });   
        }
    });
}
Wie man sieht habe ich versucht raus zu finden, was mit dem arr_In los ist.

Hier die komplette Ausgabe der Konsole:
Code:
In  : [object Object]
In  : 1
Out :
Out : 1

1Debug :
2Debug : undefined
3Debug : object
4Debug : undefined
5Debug : 1
/home/pi/node_modules/mongodb/lib/operations/mongo_client_ops.js:462
      throw err;
      ^

TypeError: Cannot set property 'ZielNr' of undefined

Ich bin mir aber nicht sicher ob der ganze Code euch hilft. Ich möchte nicht eure Zeit verschwenden.
Meiner Ansicht nach liegt mein Problem im Array.push();

Was ich haben will ist folgendes
Pseudocode
Code:
ArrayIn[] <- Enthält Objekte mit der Eigenschaft-ThreadNr 
ArrayOut[] <- Am Anfang leer
For each Objekte{
    Funktion_Gibt_Es_ThreadNr_In_DB 
       -Wenn Nein
         Füge Objekt in ArrayOut ein
}
ArrayOut[] <- Enthält alle Objekte die noch nicht in DB.

- - - Aktualisiert - - -

Also Kommando zurück!
Array.push() ist nicht das Problem.
Ich habe etwas mit dem Code rumgespielt und herausgefunden das das Problem wohl doch von der Funktion F_IsThreadInDB() erzeugt wird, wobei ich immer noch nicht verstehe wieso. Die Funktion bekommt als Parameter 'nur' den Thread und macht damit eigentlich nichts außer es gegen die DB zu testen. Trotzdem ist das Objekt arr_Adressen_In[i] nach dem Aufruf der Funktion weg????

Mit folgendem Code klappt es.
Code:
for (i = 0; i < arr_Adressen_In.length ; i++) {
        let objCopy = Object.assign({}, arr_Adressen_In[i]);        
        F_IsThreadInDB(arr_Adressen_In[i].ThreadNr,function(boo_IsInDB){            
            if (boo_IsInDB == false) {                
                arr_Adressen_Out.push(objCopy);                 
            }           
        });        
    }
Es wiederstrebt mir zwar eine für mich unnötige Kopie des Objektes zu erzeugen aber wenn es läuft.
??
Naja. Es tut mir leid wenn ich eure Zeit verschwendet habe. Wie gesagt ich lerne noch, auch wenn mich Javascript und Node.Js immer wieder überrascht.:confused:
 
Zurück
Oben