2016-05-23 1 views
1

У меня есть данные в следующем формате:CoffeeScript: один вкладыш для отображения объекта в другие

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

Я хочу, чтобы создать объект, где starting_position становится ключ и ключ в исходном data становится значением. Я могу сделать это так:

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

Но я не могу себе представить, что нет один лайнера сделать то же самое ...

+1

'Object.keys (данные) .map (функция (пункт) {возвращения { start_position: item}}); ' – Rayon

+1

@Rayon close, но вы хотите уменьшить здесь' Object.keys (data) .reduce (((obj, k) -> startpos = data [k] .starting_position; obj [startpos] = data [k]; obj), {}) ' –

ответ

1

Если вы используете lodash 4.1.0 или более поздней версии вы можете сделать это с помощью этой функции https://lodash.com/docs#invertBy

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

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

+0

Я знаю, что это не отвечает на мой конкретный вопрос (с CoffeeScript), но я использую' lodash', и это намного лучше выглядящее решение, чем что-либо еще. – ddinchev

1

Вы не можете уменьшить его семантический, но вы можете сделать его более краткий

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

Комментарий Района был там как можно скорее. Вы хотите использовать reduce:

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

Хотя, что это оскорбительно долго, не очень идиоматических CoffeeScript, и откровенно менее читабельным, чем оригинал, это один вкладыш.

Смежные вопросы