【发布时间】:2019-05-01 19:40:42
【问题描述】:
我从一个我想要修饰并创建一个新对象的 api 获得一个 json 响应。
const things = [{
"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [{
"value": "3",
"onclick": "CreateNewDoc()"
},
{
"value": "5",
"onclick": "OpenDoc()"
},
{
"value": "8",
"onclick": "CloseDoc()"
}
]
}
}
},
{
"menu": {
"id": "image",
"value": "Image",
"popup": {
"menuitem": [{
"value": "New",
"onclick": "CreateNewImage()"
},
{
"value": "Open",
"onclick": "OpenImage()"
},
{
"value": "Close",
"onclick": "CloseImage()"
}
]
}
}
}
];
我知道这样做的旧方法是这样的:
const chs = [];
things.forEach((e) => {
const i = {};
i.Id = e.menu.id;
i.Value = e.menu.value;
i.PopupValue = e.menu.popup.menuitem[0].value;
i.SomethingComputed = e.menu.popup.menuitem[0].value - e.menu.popup.menuitem[1];
i.ShiftedUp = e.menu.popup.menuitem;
chs.push(ch);
});
现在我想使用 ES6 和解构来做到这一点。但我认为我没有尽我所能,因为我:1)仍然有循环; 2)必须创建这个新对象;和 3) 需要这些单独的计算线。 我可以把它弄得更紧凑吗?
const chs = [];
things.forEach((e) => {
const {
Id: {id},
Value: {value},
PopupValue : {menu: {popup} },
} = e;
// computed
const someComputedValue = Value - PopupValue;
// new object
const ch = {
Id,
Value,
SomeComputedValue
}
chs.push(ch);
});
【问题讨论】:
-
您可以通过使用
Array#map而不是Array#forEach来提高可读性。解构可能会帮助您使其更紧凑,但在这种情况下不会使其更具可读性。 -
旧方式干净、易读,而且可能比使用解构更快。
-
@adiga 不,解构本身并不慢。
-
@adiga 临时变量通常不会影响速度,解释器无论如何都必须将中间结果存储在某个地方——并且在编译时,相同的数据流图(有或没有附加变量)通常会导致相同的结果注册分配。
-
@adiga 想一想,第一个 sn-p 可能比解构为临时变量还要慢,因为(昂贵的)属性访问必须重复多次。优化器必须竭尽全力推断它可以安全地将它们折叠成每个属性一个,证明它们没有副作用(例如,某些对象的 getter 属性)。
标签: javascript ecmascript-6 destructuring