LoDash:从对象属性数组中获取值数组

209

我确定它在 LoDash 文档中的某个地方,但似乎找不到正确的组合。

var users = [{
      id: 12,
      name: 'Adam'
   },{
      id: 14,
      name: 'Bob'
   },{
      id: 16,
      name: 'Charlie'
   },{
      id: 18,
      name: 'David'
   }
]

// how do I get [12, 14, 16, 18]
var userIds = _.map(users, _.pick('id'));
8个回答

414

自版本v4.x起,您应该使用_.map

_.map(users, 'id'); // [12, 14, 16, 18]

这样它就对应于本地的Array.prototype.map方法,您可以编写(ES2015语法):

users.map(user => user.id); // [12, 14, 16, 18]

在 v4.x 之前,您可以以相同的方式使用 _.pluck

_.pluck(users, 'id'); // [12, 14, 16, 18]

谢谢,这比 _.toArray(_.mapValues(users, 'id')) 好多了。 - YarGnawh
1
我怎样才能通过ID获取名称,也就是说,我们怎样才能获取超过两个的值? - John
8
@John的代码段意为将一个包含用户信息的数组转换为只包含用户id和用户名的对象数组,具体实现使用了ES6中的解构语法和箭头函数。同样的转换可以使用lodash库的map函数来完成,其中也使用了解构语法和箭头函数。可读性更佳的代码如下:users.map(user => ({ id: user.id, name: user.name }))_.map(users, user => ({ id: user.id, name: user.name })) - dfsq
@dfsq,把对象添加到输出数组中是个好的解决方案。谢谢! - Ted Corleone
如果原始数组中有多个记录怎么办?如何仅获取唯一的记录? - Sami Ullah

22
在新的lodash版本v4.0.0中,_.pluck被弃用,使用_.map代替。
然后您可以使用以下代码:
_.map(users, 'id'); // [12, 14, 16, 18]

您可以在Github Changelog中查看。


21

使用纯JS:

var userIds = users.map( function(obj) { return obj.id; } );

3
您可以将其简化为 var userIds = users.map( obj => obj.id ); - Kamil Naja
10
跟上我的水平 users.map(({id})=>id) - user10706046

15

如果您需要从每个对象中提取多个属性,则

let newArr = _.map(arr, o => _.pick(o, ['name', 'surname', 'rate']));

你好,有没有任何lodash方法可以实现这个? - Lying_cat

11

通过 ES6,可以获得更简单、更快速的方法

let newArray = users.flatMap(i => i.ID) // -> [ 12, 13, 14, 15 ]

为什么要使用 flatMap() 而不是 map() - Lacek
@Lacek map() 用于对象操作,而 flatMap() 则用于将你的 Array<Object> 软化为单个数组。 - GYTO
3
我知道map()flatMap()的区别。我只是想知道为什么在已经有map()答案的情况下,你建议使用flatMap()。如果你能详细说明何时应该使用flatMap()而不是map(),那就太好了。 - Lacek
@Lacek 因为在某些情况下从数组中获取所需的基本数据确实非常有用。有用的链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap - GYTO

-3

const users = [{
      id: 12,
      name: 'Adam'
   },{
      id: 14,
      name: 'Bob'
   },{
      id: 16,
      name: 'Charlie'
   },{
      id: 18,
      name: 'David'
   }
]
const userIds = _.values(users);
console.log(userIds); //[12, 14, 16, 18]


OP只需要ID。你的代码没有打印出ID,而是整个对象。 - JW_

-3
如果您正在使用本地JavaScript,则可以使用以下代码 -
let ids = users.map(function(obj, index) {

    return obj.id;
})

console.log(ids); //[12, 14, 16, 18]

OP 明确要求 Lodash 解决方案。 - Ariel Weinberger

-21

这将在弹出窗口中为您提供所需内容。

for(var i = 0; i < users.Count; i++){
   alert(users[i].id);  
}

2
循环遍历数组中的每个元素。数组是一个数据结构,包含索引和对应数据类型的值(在本例中为对象)。只有通过计算数组索引中的元素才能访问对象。循环结构实现了这一点。 - user1789573

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接