我有这个简单的功能,希望进一步简化:
setAreas() {
this.areas = ipcRenderer.sendSync('request', 'areas').map(_area => {
_area.locations = _area.locations.map(locationId => this.getLocation(locationId))
return _area
})
}
是否可以通过在_area.locations
上执行映射并返回更新的_area
来将其简化为单线?
答案 0 :(得分:4)
一种选择是使用Object.assign
,它将返回分配给以下对象的基础对象:
setAreas() {
this.areas = ipcRenderer.sendSync('request', 'areas').map(_area => (
Object.assign(_area, { locations: _area.locations.map(locationId => this.getLocation(locationId)) })
));
}
但这不是那么可读。我更喜欢您当前的代码。
请注意,.map
适用于将一个数组转换为另一个数组的情况。在这里,您只需要对现有数组中的每个对象进行变异; forEach
更合适:
setAreas() {
this.areas = ipcRenderer.sendSync('request', 'areas');
this.areas.forEach((a) => a.locations = a.locations.map(locationId => this.getLocation(locationId)))
}
如果getLocation
仅接受一个参数,则可以打高尔夫球
a.locations = a.locations.map(locationId => this.getLocation(locationId))
向下
a.locations = a.locations.map(this.getLocation.bind(this))
(如果不需要.bind(this)
上下文,您甚至可以删除this
)
答案 1 :(得分:1)
您可以使用destructuring
setAreas() {
this.areas = ipcRenderer.sendSync('request', 'areas').map(_area => ({
..._area, locations: _area.location.map(locationId => this.getLocation(locationId))
})
}