2016-12-09 2 views
1

Ich habe ein Array von Objekt, und ich möchte es in eine Karte von Schlüssel-Wert-Paare mit dem id als Schlüssel konvertieren. Ich möchte dies jedoch sowohl für die Root-Ebene als auch für das Attribut recipes tun.Unterstrich für mehrere verschachtelte Ebene Arrays

Array resp:

[ 
    { 
    "id": "1", 
    "recipes": [ 
     { 
     "id": 4036 
     }, 
     { 
     "id": 4041 
     } 
    ] 
    }, 
    { 
    "id": "2", 
    "recipes": [ 
     { 
     "id": 4052 
     }, 
     { 
     "id": 4053 
     } 
    ] 
    } 
] 

Gewünschtes Ergebnis

{ 
    "1": { 
    "id": "1", 
    "recipes": { 
     "4036": { 
     "id": 4036 
     }, 
     "4041": { 
     "id": 4041 
     } 
    } 
    }, 
    "2": { 
    "id": "2", 
    "recipes": { 
     "4052": { 
     "id": 4052 
     }, 
     "4053": { 
     "id": 4053 
     } 
    } 
    } 
} 

Ich weiß, wie dies zu tun lodash durch die folgende Funktion:

Mit Underscore.js

function deepKeyBy(arr, key) { 
    return _(arr) 
    .map(function(o) { // map each object in the array 
     return _.mapValues(o, function(v) { // map the properties of the object 
     return _.isArray(v) ? deepKeyBy(v, key) : v; // if the property value is an array, run deepKeyBy() on it 
     }); 
    }) 
    .keyBy(key); // index the object by the key 
} 

Für dieses Projekt aber ich suche eine elegante Lösung, um die gleiche Sache zu tun unterstreichen mit - machen alle Objekte innerhalb des Arrays verschachtelt id als Schlüssel verwenden. Weiß jemand, wie man das macht?

Danke!

EDIT: Added das gewünschte Ausgabeformat

+0

Können Sie die Struktur des gewünschten Ergebnisses anzeigen? – hackerrdave

+1

@hackerdave Ich habe oben das gewünschte Ergebnis hinzugefügt – alchuang

Antwort

0

würde ich Array.reduce auf die Antwort verwenden und eine verschachtelte Array.reduce auf den Rezepten um das gewünschte Ergebnis zu produzieren. Hier ist ein es6 Beispiel:

resp.reduce((p, c) => { 
    p[c.id] = { 
    id: c.id, 
    recipes: c.recipes.reduce((r, cr) => { 
     r[cr.id] = { id: cr.id } 
     return r; 
    }, {}) 
    } 
    return p; 
}, {}); 

Eine ausführlichere und nicht-es6 Version:

var resp = [ 
 
    { 
 
    "id": "1", 
 
    "recipes": [ 
 
     { 
 
     "id": 4036 
 
     }, 
 
     { 
 
     "id": 4041 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    "id": "2", 
 
    "recipes": [ 
 
     { 
 
     "id": 4052 
 
     }, 
 
     { 
 
     "id": 4053 
 
     } 
 
    ] 
 
    } 
 
]  
 

 
var formatted = resp.reduce(function(data, cur) { 
 
    data[cur.id] = { 
 
    id: cur.id, 
 
    recipes: cur.recipes.reduce(function(recips, curRecip) { 
 
     recips[curRecip.id] = { id: curRecip.id } 
 
     return recips; 
 
    }, {}) 
 
    } 
 
    return data; 
 
}, {}); 
 

 
console.log(formatted);

Wenn Sie Muss Verwendung Strich, könnten Sie wickeln resp und c.recipes:

_(resp).reduce((p, c) => { 
    p[c.id] = { 
    id: c.id, 
    recipes: _(c.recipes).reduce((r, cr) => { 
     r[cr.id] = { id: cr.id } 
     return r; 
    }, {}) 
    } 
    return p; 
}, {}); 
Verwandte Themen