# nodeJS JavaScript Object require



## BodyLAB (29. Aug 2022)

Hallo zusammen,
ich hab eine Frage wie schafft man es ein JavaScript Objekt mit require zu laden?
Hier einmal mein Versuch:
Diese Variable möchte ich laden:


```
let modul = {
    data: {
        
        "name": "John",
        "age": 30,
        "car": null
    },
    12345: {
        "name": "test"
    }
};
```

Und hier der Code wie ich es lade und versuche auszugeben doch leider ist es immer leer oder ich bekomme Fehlermeldungen :-( 
Ich möchte später das Objekt gerne verändern etc. doch erst einmal muss ich es vernünftig geladen bekommen 


```
"use strict";

let data = require('/path/modul.js');

console.log(data); //Ausgabe {}
```


----------



## httpdigest (29. Aug 2022)

Du deklarierst in deinem Modul ja einfach eine Variable "modul". Deklarierte Variablen sind nicht sichtbar in einbindenden Modulen, es sei denn, sie werden exportiert.
Und in CommonJS kannst du Symbole exportieren über das eingebaute Property `module.exports`.
Also dann so:

```
module.exports = {
    data: {
        name: "John",
        age: 30,
        car: null
    },
    12345: {
        name: "test"
    }
};
```


----------



## KonradN (29. Aug 2022)

Wenn Du ein Modul baust, dann musst Du da natürlich auch etwas exportieren. Du exportierst ja in Deinem Modul nichts und daher ist das auch leer.


```
exports.data = {
        "name": "John",
        "age": 30,
        "car": null
    };
exports.x1234 = {
        "name": "test"
    };
```


```
var data = require("./data.js");

console.log(data);
```


```
konrad@MBP-von-Konrad node % node app.js
{ data: { name: 'John', age: 30, car: null }, x1234: { name: 'test' } }
konrad@MBP-von-Konrad node %
```


----------



## BodyLAB (29. Aug 2022)

Wie immer super schnell  Danke für die Hilfe.

Weiß jemand wenn der Schlüssel der Objekte nur Zahlen sind, wie bekommt man diese dann angesprochen? Und kann ich aus dem geladenen Objekt diese Objekte raus löschen?

```
module.exports = {
    data: {
        12345: {
            name: "Tesla"
        },
        76543456: {
            name: "Karl"
        },
        Person: {
            "name": "John",
            "age": 30,
            "car": null
        }
    }

};
```

Also was ich meine ist: um an die Datenenelemente von Person zu kommen kann ich ja nun so drauf zu greifen:

```
let data = require('/home/redqu33n/Schreibtisch/modul.js');

console.log(data);
console.log(data.data.Person);
```

mit data.data.Person bekomme ich { name: 'John', age: 30, car: null } zurück. 
Nun möchte ich aber im Schlüssel nur Zahlen stehen haben und diese später sortieren. Dazu müsste ich aber ja die Zahlen irgendwie ansprechen. 
Sobald ich z. B. die Person aus meinem eigentlichen data Objekt (das was ich mit require lade) in eine Varibale geladen habe, möchte ich sehr gerne aus data das Objekt löschen.

Kann mir jemand kurz erklären wie ich beides hin bekomme? Ich finde dazu irgendwie nix, vielleicht gebe ich auch das falsche bei den Suchmaschinen ein :-(
Danke


----------



## httpdigest (29. Aug 2022)

Du kannst den Index-Operator verwenden, also: `data.data[12345]`, um auf das Objekt mit dem Schlüssel `12345` zuzugreifen.


----------



## KonradN (29. Aug 2022)

Eine alternative Lösung könnte auch noch das Reflect.get sein. Also z.B ein `Reflect.get(data.data, "12345")`


----------



## httpdigest (29. Aug 2022)

Jupp, nur sollte man evtl. hier darauf achten, dass das z.B. vom IE11 nicht unterstützt wird (falls man dazu noch kompatibel sein möchte).
Aber er scheint hier ja sowieso Node.js zu verwenden.


----------



## BodyLAB (29. Aug 2022)

genau mit node.js nur wenn ich die Zahlen nicht kenne wie mach ich es dann? Sprich wenn ich nicht sehe das dort 12345 steht. data.data[?UNBEKANNT?] unbekannt aber eine Zahl ;-)


----------



## httpdigest (29. Aug 2022)

Wenn du die Zahlen nicht kennst, ist es nicht sinnvoll, ein JavaScript Objekt mit Properties zu verwenden. Klar, man kann auch hier Reflection verwenden, um über die Keys zu iterieren, aber: Du solltest das Problem dann anders modellieren. Z.B. über ein Array, welches als Elemente Objekte mit der Struktur: `{key: zahl, value: wert}` enthält, wenn du einfach nur über die Key/Value-Paare iterieren willst und keinen indexierten Zugriff brauchst.


----------



## KonradN (29. Aug 2022)

Schau Dir einmal im Internet die Doku zu Reflect an. Reflect.ownKeys(...) liefert die dir Schlüssel, die das Objekt hat.

Also etwas wie `Reflect.ownKeys(data.data)` sollte dir ein Array liefern: [ 12345, 76543456, Person ]

Edit: @httpdigest ist wieder etwas schneller ... und die Doku zu Reflect.ownKeys findet sich unter: https://tc39.es/ecma262/#sec-reflect.ownkeys


----------



## BodyLAB (29. Aug 2022)

Okay danke  Werde ich mir anschauen ;-)

Könnte es nicht auch mit Object.keys(data) gehen? 
Aus dem geladenen Objekt sollen die einträge dann noch gelöscht werden, würde da delete "key (unsere Zahlen)" dann ausreichen um alle anderen einträge wie name etc. zu löschen?


----------



## KonradN (29. Aug 2022)

Ja, damit sollte es meiner Meinung nach ebenso gehen. Gibt paar Unterschiede zwischen diesen beiden Möglichkeiten, die unter








						What is the difference between Reflect.ownKeys(obj) and Object.keys(obj)?
					

Testing them out in a real simple case yields the same output:  const obj = {a: 5, b: 5}; console.log(Reflect.ownKeys(obj)); console.log(Object.keys(obj));  // Result ['a', 'b'] ['a', 'b'] When does




					stackoverflow.com
				



auch etwas erläutert werden.

Ich muss gestehen, dass ich da aber auch nicht so tief in der Materie drin stecke - ich habe mit JavaScript nur sehr wenig Erfahrung. (Habe da lange versucht einen Bogen drum zu machen und habe erst seit ein paar Wochen etwas mit Angular und Co angefangen.) Aber evtl. kann @httpdigest da auch noch paar Worte zu verlieren.


----------



## httpdigest (29. Aug 2022)

BodyLAB hat gesagt.:


> Aus dem geladenen Objekt sollen die einträge dann noch gelöscht werden, würde da delete "key (unsere Zahlen)" dann ausreichen um alle anderen einträge wie name etc. zu löschen?


Ja, du kannst den `delete` Operator (etwa via `delete data[key]`) hierfür verwenden, aber wie bereits oben gesagt, halte ich die Modellierung als Objekt mit Properties hier für extrem ungeeignet, wenn du einfach nur über alle Properties iterieren möchtest, diese abfragen willst und anschließend löschen willst.
Das ist aus Performance-Sicht eine Katastrophe, weil aktuelle JavaScript-Engines wie etwa V8 für so etwas nicht ausgelegt sind.
Sobald du ein Property zu einem JavaScript Objekt hinzufügst, oder ein Property per delete entfernst, erstellt V8 hier eine neue "Hidden Class", die dem "Shape" deines neuen Objektes entspricht.
Sehr viel besser wäre hier, wie gesagt, die Nutzung eines Arrays.
Ja, es ist richtig, dass aus JavaScript-Sicht ein Array auch nur ein Objekt mit numerischen Properties ist, aber JavaScript-Engines optimieren hier anders.


----------

