CoffeeScript:将对象映射到另一个对象的一个行程序

CoffeeScript:将对象映射到另一个对象的一个行程序,coffeescript,Coffeescript,我有以下格式的数据: data = { car1: { starting_position: 1, ... }, car5: { starting_position: 2, ... } } 我想创建一个对象,其中起始位置成为键,原始数据中的键成为值。我可以这样做: byStartingPosition = {} for k, properties of data byStartingPosition[properties.starting

我有以下格式的数据:

data = {
  car1: {
    starting_position: 1,
    ...  
  },
  car5: {
    starting_position: 2,
    ...
  }
}
我想创建一个对象,其中
起始位置
成为键,原始
数据
中的键成为值。我可以这样做:

byStartingPosition = {}
for k, properties of data
  byStartingPosition[properties.starting_position] = k

但是我无法想象没有一个行程序能做到同样的…

你不能减少它的语义,但你可以使它更简洁

byStartingPosition = {}
byStartingPosition[v.starting_position] = k for k,v of data

人造丝的评论几乎是正确的。您想使用
减少

byStartPos = Object.keys(data).reduce(((obj, k) -> start = data[k].starting_position; obj[start] = k; obj), {})

尽管这是一个令人讨厌的冗长、不太地道的咖啡脚本,坦率地说,它的可读性不如您的原始版本,但它是一行代码。

如果您使用的是lodash 4.1.0或更高版本,您可以使用此函数


Object.keys(data).map(函数(项){return{start\u position:item}})
@Rayon close但是你想在这里reduce
Object.keys(data).reduce((obj,k)->startpos=data[k].起始位置;obj[startpos]=data[k];obj],{})
我知道这并不能回答我的具体问题(用CoffeeScript),但我使用的是
lodash
,这个解决方案比其他任何方案都好看得多。
_.invertBy data, (v) -> v.starting_position