我有一个对象数组,我希望将其转换为键值对的映射,并以id
为键。但是,我想在根级别和recipes
属性中执行此操作。
数组resp
:
[
{
"id": "1",
"recipes": [
{
"id": 4036
},
{
"id": 4041
}
]
},
{
"id": "2",
"recipes": [
{
"id": 4052
},
{
"id": 4053
}
]
}
]
期望的结果
{
"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
作为关键。有谁知道怎么做?
谢谢!
编辑:添加了所需的输出格式
答案 0 :(得分: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;
}, {});