【问题标题】:Computed destructuring of nested Objects嵌套对象的计算解构
【发布时间】:2016-09-27 10:46:25
【问题描述】:

通过解构从Objects中提取属性很方便:

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

是否可以使用计算模式解构嵌套的Objects?

【问题讨论】:

    标签: javascript object nested ecmascript-6 destructuring


    【解决方案1】:

    不,这是不可能的。解构仅适用于您知道其结构的对象。当然可以

    var keys = ["address", "city"];
    var {[keys[0]]: {[keys[1]]: city}} = o;
    

    但不适用于任意嵌套的对象。您必须使用递归函数来遍历属性路径。请参阅问题Convert JavaScript string in dot notation into an object reference 和许多其他问题。

    【讨论】:

    • 我知道 reduce 或 recursion 是解决这个问题的合适工具。我只是想知道解构是否提供了另一种方式。谢谢!
    【解决方案2】:

    不,这是不可能的。 JavaScript 没有像 "p1.p2" 这样人们似乎如此迷恋的“对象路径”的概念,无论是在解构的上下文中还是在其他任何地方。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      猜你喜欢
      • 2021-11-16
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2017-03-18
      • 2017-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多