2016-05-29 42 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