Liste von Eigenschaften zuweisen
pl
- javascript
0 dedlfix0 pl
Also was ich suche ist der Perl-Hash-Slice in Javascript. Gibt es das überhaupt?
In Perl sieht das so aus:
my %h = ();
my @cols = qw(name vname str plz ort);
@h{@cols} = qw(Heinrich Ernst Stadtweg 12345 Hamm);
JS? Da wäre %h ein Objekt. Und cols wären die Eigenschaften mit Werten. MFG
Tach!
Also was ich suche ist der Perl-Hash-Slice in Javascript. Gibt es das überhaupt?
In Perl sieht das so aus:
my %h = (); my @cols = qw(name vname str plz ort); @h{@cols} = qw(Heinrich Ernst Stadtweg 12345 Hamm);
JS? Da wäre %h ein Objekt. Und cols wären die Eigenschaften mit Werten.
Beschreib doch mal, was du in Javascript zu erreichen versuchst, ohne dass man Perl-Code lesen können muss, um überhaupt die Frage zu verstehen.
Möchtest du ein Array mit Keys und ein Array mit Werten so verbinden, dass ein Objekt mit diesen Keys und Werten entsteht? Das kann man hinbekommen, aber eine fertige Funktion dazu existiert meines Wissens nicht. Ich würde eher versuchen, eine andere Herangehensweise an das eigentliche Problem zu suchen, als mit solchen Datenstrukturen hantieren zu müssen.
Aber ansonsten geht das schon mit Zwischenschritt, der ein Array mit Arrays aus Key und zugehörigem Value erzeugt.
const keys = ['a', 'b', 'c'];
const values = [1, 2, 3];
const key_values = keys.map(function(key, index) {
return [key, values[index]];
});
Das Objekt gibts dann mit Object.fromEntries(key_values) in modernen Browsern.
dedlfix.
Es geht praktisch darum diese Zeilen
for(var i = 0; i < cols.length; i++){
wk[cols[i]] = values[i];
}
durch eine Zeile zu ersetzen. Hier ist die Anwendung
MFG
Tach!
Es geht praktisch darum diese Zeilen
for(var i = 0; i < cols.length; i++){ wk[cols[i]] = values[i]; }
durch eine Zeile zu ersetzen.
Nimm die Zeilenumbrüche raus.
Ansonsten könnte man noch von iterativ auf funktional umstellen, aber das spart auch keine Zeilen.
dedlfix.
for(var i = 0; i < cols.length; i++){ wk[cols[i]] = values[i]; }
durch eine Zeile zu ersetzen.
Nimm die Zeilenumbrüche raus.
Die geschweiften Klammern können auch weg:
for( var i = 0; i < cols.length; i++ ) wk[cols[i]] = values[i];
Hallo ursus,
ich denke auch, dass es da keinen direkteren Weg gibt. Man muss nicht alles in die Sprache einbauen, eine Funktion reicht oft auch.
Ich hätte noch eine Variante mit foreach oder reduce anzubieten:
const cols = [ 'a', 'b', 'c'];
const values = [ 1, 2, 3];
let obj = buildObject(cols, values);
console.log(obj);
// {a: 1, b: 2, c: 3}
function buildObject(cols, values, proto) {
let o = Object.create(proto || new Object());
// so
return cols.reduce((a,c,i) => (a[c] = values[i], a), o);
// oder so
return cols.foreach((c,i) => o[c] = values[i], o);
}
Da kann man dann auch auf Wunsch gleich einen Prototypen angeben (ähnlich wie bless in Perl)
foreach ist besser lesbar als reduce, finde ich.
Rolf
Tach!
Meine erste Lösung war zwar auch eienn Schritt zu umständlich (das Zwischen-Array), aber hier kann man auch noch mal den Rotstift ansetzen.
let o = Object.create(proto || new Object());
Statt let
geht auch const
. Der Variable o wird in ihrem Geltungsbereich kein weiterer Wert zugewiesen. Dass dem Objekt die Eigenschaften geändert werden, ist für const nicht von Belang.
Object.create(proto || new Object())
kann man zu proto || {}
verkürzen. Der Unterschied ist, wenn jemand kein Objekt für proto übergibt, gibts bei dir eine Exception, bei der kurzen Variante hingegen "Garbage In, Garbage Out". Zumindest das new Object()
geht als {}
zu vereinfachen.
return cols.foreach((c,i) => o[c] = values[i], o);
Das geht so nicht, man muss schon das o
zurückgeben und nicht das undefined
vom forEach()
, was man auch noch mit großem E schreiben muss.
dedlfix.
Aloha ;)
Es geht praktisch darum diese Zeilen
for(var i = 0; i < cols.length; i++){ wk[cols[i]] = values[i]; }
durch eine Zeile zu ersetzen.
Nichts einfacher als das:
for(var i = 0; i < cols.length; i++){ wk[cols[i]] = values[i]; }
Grüße,
RIDER
Aloha ;)
Nichts einfacher als das:
Oh, Schade, @dedlfix war schneller. Hatte die Seite noch nicht neu geladen.
Grüße,
RIDER
Es geht praktisch darum diese Zeilen
for(var i = 0; i < cols.length; i++){ wk[cols[i]] = values[i]; }
durch eine Zeile zu ersetzen. Hier ist die Anwendung
Da du nur eine fixe Anzahl an Spalten hast, könnte man das auch im Code statisch notieren:
const landkreis = {
WKR_NR: values[0],
WKR_NAME: values[1],
LAND_NR: values[2],
LAND_NAME: values[3],
LAND_ABK: values[4]
}
Ist nicht zwar nicht kürzer, hat aber auch Vorteile.