2016-05-29 55 views
3

它的方便通過解構來提取Object的屬性:計算嵌套對象的拆解

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

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

解構模式可以被計算爲好:

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

但似乎顯然不可能提取屬性動態的嵌套對象:

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

是否可以使用計算模式解構嵌套的Object

回答

4

不,這是不可能的。解構只適用於你知道的結構的對象。你當然可以做

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

但不適用於任意嵌套的對象。您將不得不使用遞歸函數來遍歷屬性路徑。看到問題Convert JavaScript string in dot notation into an object reference和許多其他人。

+0

工作,我知道,減少或遞歸針對此問題合適的工具。我只是想知道解構是否提供了一種替代方法。謝謝! – rand

2

不,這是不可能的。 JavaScript沒有像"p1.p2"這樣的「對象路徑」的概念,人們似乎非常迷戀它,不管它是在解構還是其他任何地方。

-1

我寫了一個標準的可重用的Object方法來動態地訪問嵌套屬性。你可以在任何對象上使用它來訪問你的嵌套值。這就是所謂的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]]; 
}; 

所以一旦你有這樣的它很容易。它將採用嵌套屬性的動態參數。如果它們是字符串類型,則它們是對象屬性,如果是數字類型,則它們是數組索引一旦你有了這個,你的工作變得非常簡單。讓我們來看看..

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);

你可以看到getNestedValue()和它的孿生setNestedValue()在https://stackoverflow.com/a/37331868/4543207

+1

[不要像這樣擴展Object.prototype](http://stackoverflow.com/q/13296340/1048572)。 – Bergi

+0

@Bergi謝謝你指出這一點。在生產代碼中注意是非常值得的。 – Redu