CoffeeScript:将对象映射到另一个的一个衬垫

时间:2016-05-23 09:44:46

标签: coffeescript

我的数据格式如下:

data = {
  car1: {
    starting_position: 1,
    ...  
  },
  car5: {
    starting_position: 2,
    ...
  }
}

我想创建一个对象,其中starting_position成为键,原始data中的键成为值。我可以这样做:

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

但我无法想象没有一个班轮可以做同样的事情......

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

如果您使用的是lodash 4.1.0或更高版本,则可以使用此功能进行https://lodash.com/docs#invertBy

_.invertBy data, (v) -> v.starting_position

https://jsfiddle.net/7kf9wn71/2/

答案 2 :(得分:0)

Rayon的评论至关重要。您想使用reduce

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

虽然那是令人讨厌的长篇,不是非常惯用的咖啡因,而且坦率地说比你原来的可读性差,但这只是一个单行。