通过解构从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
进行解构?
答案 0 :(得分:4)
不,这是不可能的。解构仅适用于您了解其结构的对象。你当然可以做到
var keys = ["address", "city"];
var {[keys[0]]: {[keys[1]]: city}} = o;
但不适用于任意嵌套的对象。您必须使用递归函数来处理属性路径。请参阅问题Convert JavaScript string in dot notation into an object reference和其他许多人。
答案 1 :(得分:2)
不,这是不可能的。 JavaScript没有这些"对象路径的概念"像"p1.p2"
一样,人们似乎很迷恋,无论是在解构的背景下还是其他任何地方。
答案 2 :(得分:-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(),它是在https://stackoverflow.com/a/37331868/4543207工作的双胞胎setNestedValue()