2016-07-12 7 views
1

ich nach Namen dieses Objekt Gruppe, die versuche, so fein würde ich in der Lage sein, alle ‚duval‘ von ‚lulu‘ Namen zu unterscheiden:Allgemeine Gruppierung von Objekten Eigenschaften

const groupName = R.groupBy(R.prop('name'), [data]); 

aber dies wird nicht Arbeit an:

let data = { 
    benj: { 
     content : undefined, 
     name : 'duval', 
     complete: false, 
     height : 181 
    }, 

    joy: { 
     content : undefined, 
     name : 'duval', 
     complete: true 
    }, 


    kaori: { 
     content : undefined, 
     name : 'lulu', 
     complete: true 
    }, 

    satomi: { 
     content : undefined, 
     name : 'lulu', 
     complete: true 
    } 
} 

Sollte ich das Format meines Objekts ändern, oder gibt es eine Möglichkeit, es in dieser Art von Objekt zu tun?

Antwort

2

Übergeben [data] zu groupBy wird nicht viel helfen. Sie möchten eine Liste mit einem einzelnen Artikel gruppieren. Die Tatsache, dass dieser Gegenstand Eigenschaften wie "bennj" und "Freude" anstelle von "Name" hat, ist nur ein Teil des Problems.

Sie können etwas, das funktioniert, denke ich, wenn dieser Ausgang nützlich wäre:

{ 
    duval: { 
    benj: { 
     content: undefined, 
     name: "duval", 
     complete: false, 
     height: 181 
    }, 
    joy: { 
     content: undefined, 
     name: "duval", 
     complete: true 
    } 
    }, 
    lulu: { 
    kaori: { 
     content: undefined, 
     name: "lulu", 
     complete: true 
    }, 
    satomi: { 
     content: undefined, 
     name: "lulu", 
     complete: true 
    } 
    } 
} 

Aber es ist ein bisschen mehr beteiligt: ​​

compose(map(fromPairs), groupBy(path([1, 'name'])), toPairs)(data) 

toPairs die Daten in eine Liste konvertiert von Elementen wie diesem:

[ 
    "benj", 
    { 
    complete: false, 
    content: undefined, 
    height: 181, 
    name: "duval" 
    } 
] 

dann sucht nach der Gruppierung, die Sie suchen, indem Sie den Namen des Objekts in Index 1 in dieser Liste finden.

Und schließlich map(fromPairs) wird diese Listen von Listen wieder in Objekte verwandeln.

Es ist keine besonders elegante Lösung, aber es ist ziemlich typisch, wenn Sie eine Listenverarbeitung für etwas durchführen wollen, das nicht wirklich eine Liste ist.

+0

Es scheint so einfach, wenn Sie eingeben. Danke, funktioniert sehr gut. Hätte ich "any" als Pfad angeben wollen, anstatt auf eine bestimmte Ebene zu zielen, gibt es eine Möglichkeit, dies ohne Rekursion zu tun? –

+0

Ich kann mir keinen Weg vorstellen, dies ohne Rekursion zu tun. Jemand anders könnte eine Idee haben. –

+0

Aber auch die Frage würde sich ergeben, wie Ihre Ausgabe aussehen würde. Wie würden Sie diese beliebig verschachtelten Objekte gruppieren? –

Verwandte Themen