2016-05-29 6 views
3

es bequem ist Eigenschaften von Object s zu extrahieren durch Destrukturierung:Berechnete Destrukturierung von verschachtelten Objekten

let o = {id: "100", name: "Jane Doe", address: {id:1, city:"Fargo"}}, 
key = "address"; 

let {address: {id: id}} = o; // 1 

Destrukturierung Muster als auch berechnet werden kann:

let {[key]: {city: city}} = o; // Fargo 

Aber es scheint offensichtlich nicht möglich, Eigenschaften zu extrahieren verschachtelter Objekte dynamisch:

key = "address.city"; 
({[key]: city} = o); // undefined 

Ist es möglich, verschachtelte Object s mit berechneten Mustern zu destrukturieren?

Antwort

4

Nein, das ist nicht möglich. Strukturierung ist nur für Objekte, deren Struktur Sie kennen. Sie könnten natürlich

var keys = ["address", "city"]; 
var {[keys[0]]: {[keys[1]]: city}} = o; 

aber nicht für beliebig verschachtelte Objekte tun. Sie müssen eine rekursive Funktion verwenden, die den Eigenschaftspfad durchläuft. Siehe dazu die Frage Convert JavaScript string in dot notation into an object reference und viele andere.

+0

Ich weiß, dass verringern oder Rekursion sind geeignete Werkzeuge für dieses Problem. Ich habe mich gerade gefragt, ob die Destrukturierung einen alternativen Weg bietet. Vielen Dank! – rand

2

Nein, das ist nicht möglich. JavaScript hat keine Vorstellung von diesen "Objektpfaden" wie "p1.p2", von denen die Menschen so sehr fasziniert sind, sei es im Zusammenhang mit der Destrukturierung oder anderswo.

-1

Ich hatte eine wiederverwendbare Standard-Objektmethode geschrieben, um dynamisch auf verschachtelte Eigenschaften zuzugreifen. Sie können dies für jedes Objekt verwenden, um auf Ihren verschachtelten Wert zuzugreifen. Es Object.prototype.getNestedValue()

Object.prototype.getNestedValue = function(...a) { 
    return a.length > 1 ? (this[a[0]] !== void 0 && this[a[0]].getNestedValue(...a.slice(1))) : this[a[0]]; 
}; 

Sogenannte sobald Sie diese ist es sehr einfach. Es werden dynamische Argumente für die verschachtelten Eigenschaften benötigt. Wenn sie ein String-Typ sind, sind sie Objekteigenschaften, wenn es sich um einen Zahlentyp handelt, dann sind sie Array-Indizes. Sobald Sie dies haben, wird Ihre Arbeit sehr einfach. Mal sehen ..

Object.prototype.getNestedValue = function(...a) { 
 
    return a.length > 1 ? (this[a[0]] !== void 0 && this[a[0]].getNestedValue(...a.slice(1))) : this[a[0]]; 
 
}; 
 

 
let o = {id: "100", name: "Jane Doe", address: {id:1, city:"Fargo"}}, 
 
props = ["address","city"], 
 
    v = o.getNestedValue(...props); 
 
console.log(v); 
 
// you can also pass static parameters of course... 
 
v = o.getNestedValue("address","city"); 
 
console.log(v);

Sie können getNestedValue sehen() und es ist twin setNestedValue() arbeiten bei https://stackoverflow.com/a/37331868/4543207

+1

[Erweitern Sie nicht 'Object.prototype'] (http://stackoverflow.com/q/13296340/1048572). – Bergi

+0

@Bergi Vielen Dank, dass Sie darauf hingewiesen haben. Es lohnt sich wirklich, beim Produktionscode auf etwas zu achten. – Redu

Verwandte Themen