2016-05-23 5 views
1

Ich habe Daten in folgendem Format zur Karte:Coffee: einzeiler Objekt in ein anderes

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

Ich möchte ein Objekt erstellen, wo starting_position den Schlüssel und den Schlüssel in der ursprünglichen data wird wird der Wert. Ich kann es wie folgt tun:

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

Aber ich kann nicht vorstellen, dass es keine ist ein Liner, das gleiche zu tun ...

+1

'Object.keys (Daten) .map (function (item) {return { starting_position: item}}); ' – Rayon

+1

@Rayon schließen, aber Sie möchten hier reduzieren' Object.keys (data) .reduce (((obj, k)) -> startpos = Daten [k] .starting_position; obj [startpos] = data [k]; obj), {}) ' –

Antwort

1

Wenn Sie mit lodash 4.1.0 oder später könnte man es mit dieser Funktion tun https://lodash.com/docs#invertBy

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

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

+0

Ich weiß, dass dies meine spezifische Frage nicht beantwortet (mit CoffeeScript), aber ich benutze' lodash' und das ist bei weitem besser aussehende Lösung als alles andere. – ddinchev

1

Sie können es semantisch nicht reduzieren, aber man kann es machen prägnante

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

Rayons Kommentar war da. Sie wollen reduce verwenden:

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

Obwohl das obnoxiously lang ist, nicht sehr idiomatisch Coffeescript, und ehrlich gesagt weniger lesbar als die ursprüngliche, es ist ein Einzeiler.