使用lodash从数组中返回对象属性

21

我一直在尝试通过先过滤一个对象再返回其属性。这是我的做法:

var characters = [
  { 'name': 'barney',  'age': 36, 'blocked': false },
  { 'name': 'fred',    'age': 40, 'blocked': true },
  { 'name': 'pebbles', 'age': 1,  'blocked': false }
];

_.find(characters, function(chr) {
     return  chr.age == 40
});

它返回整个对象,但我想返回特定属性。有人可以指导我怎么做吗?

任何帮助都将受到赞赏。


在你筛选出所需的对象后,只需访问属性 age 即可。 - elclanrs
2
我可以做到,但我希望用方法完成。 - Salman
4个回答

53
你可以使用 Lodash 链式调用 的能力。顾名思义,它使你能够链接 Lodash 方法的调用。这里适合使用 _.filter_.map 方法:

const characters = [
  { 'name': 'barney',  'age': 36, 'blocked': false },
  { 'name': 'fred',    'age': 40, 'blocked': true  },
  { 'name': 'pebbles', 'age': 1,  'blocked': false },
]

const names = _(characters)
  .filter(c => c.age < 40)
  .map('name')
  .value()

alert(names)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.3.0/lodash.min.js"></script>


记录一下,这是您可以使用纯JS实现的方法:

const characters = [
  { 'name': 'barney',  'age': 36, 'blocked': false },
  { 'name': 'fred',    'age': 40, 'blocked': true  },
  { 'name': 'pebbles', 'age': 1,  'blocked': false },
]

const names = characters
  .filter(c => c.age < 40)
  .map(c => c.name)

alert(names)


它有效,我用了查找(find)而不是筛选(filter),因为筛选会遍历所有的值并返回匹配数组。谢谢你的帮助。 - Salman
4
pluck 已经不再是 lodash 中的函数了 :( - SSH This
1
我更新了答案以匹配此API更新,实际上pluck只是一个map。使用ES6箭头函数甚至更清晰。 - aymericbeaumet
_.map 还支持 _.property 迭代器简写形式,如 _.map(characters, 'name') - Brandon Copeland

7
_.result(_.find(characters, function(obj) {
       return obj.age === 40;
}), 'name');

7

_.property

var array = [{a: 1, b: 2}, {a: 3, b: 4}]
array.map(_.property('a')) // => [1, 3]

_.map的简写形式

var array = [{a: 1, b: 2}, {a: 3, b: 4}]
_.map(array, 'a') // => [1, 3]

0
如评论中所提到的,显而易见的解决方案是在过滤对象后访问属性age
但是,如果你想在方法中完成,你可以先提取所有年龄值,然后在它们上面应用find函数。
var ageValues = _.pluck(characters, 'age'); //returns [36, 40, 1]

var resultAgeValue = _.find(ageValues, function(ageValue) {
   return  ageValue < 40
});

或者,链式调用更好看:

var resultAgeValue = _(characters).pluck('age').find(function(ageValue) {
   return  ageValue < 40
});

尝试使用 jsFiddle:http://jsfiddle.net/pqr/j8rL780u/


你的代码片段不起作用,它只返回第一个匹配的字符。 - aymericbeaumet
实际上,我的 jsfiddle 设计是返回第一个匹配字符!问题中的原始代码也仅返回第一个匹配对象 - 作者使用的是 find 而不是 filter - Petr
作者似乎开始使用 Lodash。考虑到非排序数组,仅返回一个值并没有太多意义。因此我使用了 filter - aymericbeaumet

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