[英]How to pass a property from an array to each of it nested child array with lodash?
您好,我们举这个例子:
var legitTask = [
{
"guid": "beb033fd-f2ca-4bde-a732-4396d560b216",
"isActive": false,
"friends": [
{
"id": 33,
"name": "Rosalind Kaufman"
},
{
"id": 41,
"name": "Marion Armstrong"
},
{
"id": 52,
"name": "Sonia Baxter"
}
]
},
{
"guid": "2ac71ecb-4d7e-4c81-bd54-f6d17ce141a9",
"isActive": true,
"friends": [
{
"id": 023,
"name": "Viola Gillespie"
},
{
"id": 31,
"name": "Anita Bass"
},
{
"id": 12,
"name": "Galloway Townsend"
}
]
},
{
"guid": "07acf598-cb57-490f-a42c-3a0ee0a543fc",
"isActive": true,
"friends": [
{
"id": 0,
"name": "Lou Elliott"
},
{
"id": 71,
"name": "Christina Spence"
},
{
"id": 82,
"name": "Doris Garner"
}
]
}
]
期望的最终结果:仅将每个父级的 isActive 属性分配给它的每个朋友
[ {
"id": 33,
"name": "Rosalind Kaufman",
"isActive": false
},
{
"id": 41,
"name": "Marion Armstrong",
"isActive": false
},
{
"id": 52,
"name": "Sonia Baxter",
"isActive": false
}, {
"id": 023,
"name": "Viola Gillespie"
"isActive": true
},
{
"id": 31,
"name": "Anita Bass"
"isActive": true
},
{
"id": 12,
"isActive": true
"name": "Galloway Townsend"
},
{
"id": 0,
"isActive": true,
"name": "Lou Elliott"
},
{
"id": 71,
"isActive": true,
"name": "Christina Spence"
},
{
"id": 82,
"isActive": true,
"name": "Doris Garner"
}
]
所以我的第一步是选择朋友和所需的属性:
let firstRound = _.map(legitTask, task =>{
return _.pick(task, ['isActive', 'friends']);
});
太好了,我现在有想要的财产和每个朋友? 现在如何将属性传递给每个朋友,(假设我有一个大列表,所以“最佳方式”是必要的,是的,我知道我可以循环和循环,但这真的会扼杀性能)
我被困在这里
_.forEach(firstRound, parent =>{
return _.map(parent.friends, task =>{
return _.assign(task, parent.isActive);
});
});
在性能方面,我总是发现 vanilla JS 比任何库实现都快。 所以我总是因为这个原因更喜欢 vanilla JS。 在这里,一个非 lodash.js 解决方案将所需的值放入数组中,尽管您可以简单地深度克隆您的原始数组:
const res = legitTask.map(obj => { return obj.friends.map(friend => { friend.isActive = obj.isActive; return friend; }); }).flat();
或者,如果您不想深度克隆,则可以使用此实现,它速度较慢,但保持旧数组完整:
const res = legitTask.map(obj => { return obj.friends.map(friend => { const returnObj = {...friend }; returnObj.isActive = obj.isActive; return returnObj; }); }).flat();
你可以这样试试。
_.reduce(legitTask, (acc, {friends, ...rest}) => acc.concat(_.map(friends, friend => ({...friend,...rest }))), [])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.