Reputation: 5451
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
Reputation: 86
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
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
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
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