繁体   English   中英

如何使用 lodash 将数组中的属性传递给每个嵌套子数组?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM