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:
Javascript:
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
Javascript:
"use strict";let data =require('/path/modul.js');
console.log(data);//Ausgabe {}
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:
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?
Also was ich meine ist: um an die Datenenelemente von Person zu kommen kann ich ja nun so drauf zu greifen:
Javascript:
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
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.
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 ;-)
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.
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?
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.
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.