如何使用lodash从对象属性数组中获取值?

时间:2020-05-13 23:00:11

标签: javascript arrays lodash

我有以下obj:

 { Id: '11ea9563-1a4c-c21b-904f-00ff98e8d5ab',
  Email: 'Email',
  Password:
   { type: 'Buffer',
     data:
      [ Buffer value] },
  roles: [ { Name: 'Developer', userroles: [Object] } ],
  Events:
   [ { Id: '11ea9556-c025-39ae-904f-00ff98e8d5ab'} ] }

我想使用lodash来获取Idroles.NameEvents.Id

_.pick(obj, ['Id', 'roles.Name', 'Events.Id']),

但是通过上面的操作,我只能设法获得ID。

如何用lodash完成此操作?

3 个答案:

答案 0 :(得分:2)

const answer = {
   id: obj.Id,
   roles: _.map(obj.roles, 'Name'),
   events: _.map(obj.Events, 'Id')
};

const obj = { 
  Id: '11ea9563-1a4c-c21b-904f-00ff98e8d5ab',
  Email: 'Email',
  Password: {
    type: 'Buffer'
  },
  roles: [ { Name: 'Developer', userroles: [Object] } ],
  Events:
   [ { Id: '11ea9556-c025-39ae-904f-00ff98e8d5ab'} ]
}

answer = {
   id: obj.Id,
   roles: _.map(obj.roles, 'Name'),
   events: _.map(obj.Events, 'Id')
};


console.log(answer);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>

答案 1 :(得分:2)

从我读过的here来看,您不能使用_.pick进行深度挑选。结合使用_.get_.map

var _ = require("lodash")

const data = {
  Id: '11ea9563-1a4c-c21b-904f-00ff98e8d5ab',
  Email: 'Email',
  Password: { type: 'Buffer' },
  roles: [
    { Name: 'Developer', userroles: [Object] }
  ],
  Events: [ { Id: '11ea9556-c025-39ae-904f-00ff98e8d5ab' } ]
}

var result = {
  Id: data.Id,
  Email: data.Email,
  'roles.Name': _.map(data.roles, 'Name'), /* Returns expected array of object values */
  'roles.Name': _.map(data.roles, o => _.pick(o, ['Name'])), /* Returns expected array of object */
  'Events.Id': _.map(data.Events, 'Id'),
};


console.log(result)

答案 2 :(得分:1)

不确定这是否是最好的答案,但是现在我已经完成了以下工作:

感谢@ marco-a

我分析了this answer,并提出了以下建议:

const deepPick = (paths, obj) => _.fromPairs(paths.map(p => [_.last(p.split('.')), _.get(obj, p)]));

到目前为止,我自己的解决方案:

  const data = _.pick(obj, ['Id', 'roles', 'events']);

  const userRoles = data.roles.map(role=> deepPick(['Name'], role));

  const eventIds = data.events.map(eventId=> deepPick(['Id'], eventId));

输出变为:

{
    "id": "11ea9563-1a4c-c21b-904f-00ff98e8d5ab",
    "roles": [
      {
        "Name": "Developer"
      },
      {
        "Name": "Admin"
      }
    ],
    "events": [
      {
        "Id": "11ea9556-c025-39ae-904f-00ff98e8d5ab"
      }
    ]
  },
}