嵌套对象的计算解构
Computed destructuring of nested Objects
通过解构从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
?
不,这不可能。 JavaScript 没有像 "p1.p2"
这样的 "object paths" 人们似乎如此迷恋的概念,无论是在解构的背景下还是其他任何地方。
不,这是不可能的。解构仅适用于您知道其结构的对象。你当然可以
var keys = ["address", "city"];
var {[keys[0]]: {[keys[1]]: city}} = o;
但不适用于任意嵌套的对象。对于走 属性 路径的函数,您必须使用递归函数。请参阅问题 Convert JavaScript string in dot notation into an object reference 和许多其他问题。
我编写了一个标准的可重用对象方法来动态访问嵌套属性。您可以在任何对象上使用它来访问您的嵌套值。它被称为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() 在
工作
通过解构从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
?
不,这不可能。 JavaScript 没有像 "p1.p2"
这样的 "object paths" 人们似乎如此迷恋的概念,无论是在解构的背景下还是其他任何地方。
不,这是不可能的。解构仅适用于您知道其结构的对象。你当然可以
var keys = ["address", "city"];
var {[keys[0]]: {[keys[1]]: city}} = o;
但不适用于任意嵌套的对象。对于走 属性 路径的函数,您必须使用递归函数。请参阅问题 Convert JavaScript string in dot notation into an object reference 和许多其他问题。
我编写了一个标准的可重用对象方法来动态访问嵌套属性。您可以在任何对象上使用它来访问您的嵌套值。它被称为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() 在