tonymx227
tonymx227

Reputation: 5451

Recursive filter with lodash

I'd like to use the Lodash function _.filter() to filter an array of array.

I'd like to get only the firsts items that have a score with scaled is equal to 1.

var newScores = [{name: 'toto', scores: [{score: 10, scaled: 1}, {score: 10, scaled: 0}]}, {name: 'tata', scores: [{score: 500, scaled: 0}, {score: 19, scaled: 0}]}];

var filterScores = _.filter(newScores, function(score) { return _.filter(score.scores, {scaled: 1}); });

console.log(filterScores);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.core.min.js"></script>

What I'd like in the result :

[{name: 'toto', scores: [{score: 10, scaled: 1}, {score: 10, scaled: 0}]}]

Upvotes: 1

Views: 203

Answers (4)

In the inner _.filter you are trying to return a list - _.filter returns the item that evaluates to a condition so you have to set that condition.

Try adding this .length > 0; in the inner filter

var newScores = [{name: 'toto', scores: [{score: 10, scaled: 1}, {score: 10, scaled: 0}]}, {name: 'tata', scores: [{score: 500, scaled: 0}, {score: 19, scaled: 0}]}];

var filterScores = _.filter(newScores, function(score) {
  return _.filter(score.scores, {scaled: 1}).length > 0; // evaluate to a list that is not empty
});

console.log(filterScores);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.core.min.js"></script>

Upvotes: 1

Abhisek Mishra
Abhisek Mishra

Reputation: 269

The proper code using lodash would be

var newScores = [{name: 'toto', scores: [{score: 10, scaled: 1}, {score: 10, scaled: 0}]}, {name: 'tata', scores: [{score: 500, scaled: 0}, {score: 19, scaled: 0}]}];

var filterScores = _.filter(newScores, function(score) { return score.scores[0].scaled === 1 });

console.log(filterScores);

Upvotes: 0

Adrian Brand
Adrian Brand

Reputation: 21638

Why do you need loadash?

var newScores = [{name: 'toto', scores: [{score: 10, scaled: 1}, {score: 10, scaled: 0}]}, {name: 'tata', scores: [{score: 500, scaled: 0}, {score: 19, scaled: 0}]}];

console.log(newScores.filter(val => val.scores[0].scaled === 1));

Upvotes: 0

Nina Scholz
Nina Scholz

Reputation: 386624

You could take _.some in the filter callback.

var newScores = [{ name: 'toto', scores: [{ score: 10, scaled: 1 }, { score: 10, scaled: 0 }] }, { name: 'tata', scores: [{ score: 500, scaled: 0 }, { score: 19, scaled: 0 }] }],
    filterScores = _.filter(newScores, ({ scores }) => _.some(scores, { scaled: 1 }));

console.log(filterScores);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.core.min.js"></script>

Upvotes: 0

Related Questions