如何在对象的元素上执行地图功能?

时间:2019-01-29 05:14:11

标签: javascript

我有这个简单的功能,希望进一步简化:

setAreas() {
  this.areas = ipcRenderer.sendSync('request', 'areas').map(_area => {
    _area.locations = _area.locations.map(locationId => this.getLocation(locationId))
    return _area
  })
}

是否可以通过在_area.locations上执行映射并返回更新的_area来将其简化为单线?

2 个答案:

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