Lodash递归过滤器

时间:2019-11-13 10:29:10

标签: javascript lodash

我想使用Lodash函数_.filter()来过滤数组数组。

我只想获得分数得分等于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>

我想要的结果:

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

4 个答案:

答案 0 :(得分:1)

在内部_.filter中,您尝试返回列表-_.filter返回计算结果为条件的项目,因此您必须设置该条件。

尝试在内部过滤器中添加此 .length> 0;

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>

答案 1 :(得分:0)

您可以在过滤器回调中使用_.some

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>

答案 2 :(得分:0)

您为什么需要重载?

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

答案 3 :(得分:0)

使用lodash的正确代码应该是

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