21

I have been trying to return a property of an object by filtering it first. Here's what I did:

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
});

It returns whole object where as I want to return specific property. Can anyone guide me how can I do it?

Any help will be appreciated.

Adam Boduch
  • 11,023
  • 3
  • 30
  • 38
Salman
  • 1,266
  • 5
  • 21
  • 41

4 Answers4

53

You could use the Lodash chaining ability. As its name implies, it enables you to chain Lodash methods calls. _.filter and _.map are appropriate here:

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>

For the record, this is how you can do in pure 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)
aymericbeaumet
  • 6,853
  • 2
  • 37
  • 50
7

_.property

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

_.map short hand

var array = [{a: 1, b: 2}, {a: 3, b: 4}]
_.map(array, 'a') // => [1, 3]
Chun Yang
  • 2,451
  • 23
  • 16
7
_.result(_.find(characters, function(obj) {
       return obj.age === 40;
}), 'name');
Ninja
  • 2,050
  • 1
  • 23
  • 27
0

As elclanrs mentioned in comment before obvious solution is just to access the property age after you filtered the object.

But if you wanted to be done in method, you can first extract all age values and then allpy find function on them:

var ageValues = _.pluck(characters, 'age'); //returns [36, 40, 1]

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

or, better looks in chain:

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

try jsFiddle: http://jsfiddle.net/pqr/j8rL780u/

Petr
  • 7,275
  • 2
  • 16
  • 16
  • Your fiddle doesn't work, it only returns the first matching character. – aymericbeaumet Aug 27 '14 at 14:57
  • Actually my jsfiddle returns the first matching character by desing! The original code in the question also returns only first matching object - author was using `find`, not `filter`! – Petr Aug 27 '14 at 15:07
  • The author appears to begin with Lodash. It doesn't make much sense to return only one value when considering a non-sorted array. Hence my use of `filter`. – aymericbeaumet Aug 27 '14 at 15:12