I have an array of an object like this
[ { 'a': 10, elements: [ { 'prop': 'foo', 'val': 10 }, { 'prop': 'bar', 'val': 25 }, { 'prop': 'test', 'val': 51 } ] }, { 'b': 50, elements: [ { 'prop': 'foo', 'val': 30 }, { 'prop': 'bar', 'val': 15 }, { 'prop': 'test', 'val': 60 } ] }, ]
What I need is sum the property Val
when prop
is foo
.
So, I have to search through elements and get all objects where prop
is foo
. With this objects, I should sum the val
property.
I tried to use many combinations of _.find
, _.pick
and so on, but I don’t get the right result. Can someone help me?
Advertisement
Answer
Here’s a solution that flattens the elements and then filters the result to get the required elements before summing the val property:
var result = _.chain(data) .map('elements') // pluck all elements from data .flatten() // flatten the elements into a single array .filter({prop: 'foo'}) // exatract elements with a prop of 'foo' .sumBy('val') // sum all the val properties .value()
Chaining is a way of applying a sequence of operations to some data before returning a value. The above example uses explicit chaining but could be (maybe should be) written using implicit chaining:
var result = _(data) .map('elements') .flatten() .filter({prop: 'foo'}) .sumBy('val');