嵌套对象的计算解构

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() 在

工作