【问题标题】:How to get values from object property array with lodash?如何使用 lodash 从对象属性数组中获取值?
【发布时间】:2020-05-13 23:00:11
【问题描述】:

我有以下 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 做到这一点?

【问题讨论】:

  • 也许stackoverflow.com/questions/50096091/…的答案可以帮助你。
  • @marco-a 感谢您的链接,但接受的答案是使用对象数组。在我的情况下,它是一个对象,但有两个数组属性。有什么想法吗?
  • 如果你向下滚动一点,答案中有一个函数deepPick,也许这个函数适合你?

标签: javascript arrays lodash


【解决方案1】:
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>

【讨论】:

  • 感谢您的回答但我只想要角色的名称,在这种情况下我得到:角色:{'0':{名称:'开发人员',用户角色:[对象]}我不想要userroles 道具在那里
  • 感谢 m8。我在下面添加了我自己的,但更喜欢你的角色,因为角色变成了 [Developer, Admin, etc] 但在我的解决方案中:[{Name:"Developer"}, {Name:"Admin"}, {Name:"Etc"}]
【解决方案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)

【讨论】:

  • _.get 在这里不是必需的。只需使用data.roles 而不是_.get(data, 'roles')
  • 这为其他方式提供了视角。比@user125661 的答案有点臃肿,但我从中学到的东西越少,投票!
【解决方案3】:

不确定这是否是最好的答案,但现在我已经做了以下事情:

感谢@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"
      }
    ]
  },
}

【讨论】:

    猜你喜欢
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    相关资源
    最近更新 更多