嵌套对象的计算解构

时间:2016-05-29 15:11:21

标签: javascript object nested ecmascript-6 destructuring

通过解构从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进行解构?

3 个答案:

答案 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()