2016-12-09 7 views
1

У меня есть массив объектов, и я хочу преобразовать его в карту пар значений ключа с ключом id. Тем не менее, я хочу сделать это как для корневого уровня, так и в пределах атрибута recipes.подчеркивание для нескольких вложенных уровней массивов

Массив resp:

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

Желаемая Result

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

Я знаю, как сделать это с помощью lodash через следующие функции:

Использования 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 
} 

Для этого проекта, однако, я ищу элегантное решение с использованием подчеркивания сделать то же самое - сделать все объекты, вложенные в массиве использовать id в качестве ключа. Кто-нибудь знает, как это сделать?

Спасибо!

EDIT: Добавлен желаемый выходной формат

+0

Вы можете показать структуру предполагаемого результата? – hackerrdave

+1

@hackerrdave Я добавил желаемый результат выше – alchuang

ответ

0

Я хотел бы использовать Array.reduce на реакцию и вложенную Array.reduce по рецептам для получения желаемого результата. Вот ES6 пример:

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; 
}, {}); 

Более многословным и не ES6 версия:

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);

Если необходимо использовать подчеркивание, вы можете обернуть resp и 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; 
}, {}); 
Смежные вопросы