嵌套对象的计算解构

5

通过解构,从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

是否可能使用计算模式解构嵌套的对象

3个回答

4
不,这是不可能的。解构只适用于你已经了解结构的对象。你当然可以这样做:
var keys = ["address", "city"];
var {[keys[0]]: {[keys[1]]: city}} = o;

但是对于任意嵌套的对象,这种方法并不适用。您需要使用一个递归函数来遍历属性路径。参见问题将JavaScript点表示法字符串转换为对象引用和其他许多问题。


我知道reduce或递归是解决这个问题的合适工具。我只是想知道解构是否提供了另一种选择。谢谢! - user5536315

2
不,这是不可能的。JavaScript没有这些“对象路径”的概念,比如"p1.p2",无论是在解构的上下文中还是其他地方。

-1

我已经编写了一个标准的可重用对象方法来动态访问嵌套属性。您可以在任何对象上使用它来访问您的嵌套值。它被称为 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);

您可以在https://dev59.com/eJffa4cB1Zd3GeqP4zpu#37331868中看到getNestedValue()和它的孪生setNestedValue()的工作。


1
不要像那样扩展 Object.prototype - Bergi
@Bergi 感谢您指出这一点。在生产代码中注意这个问题确实非常值得。 - Redu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接