J'aimerais réaliser quelque chose comme _.first
avec _.filter
, c'est-à-dire que, ayant une collection d'éléments, j'aimerais obtenir le premier (s'il existe) qui correspond à un test de vérité (itérateur).
Par exemple, étant donné un tableau comme celui-ci:
var arr = [{a: 1}, {a: 5}, {a: 9}, {a: 11}, {a: 15}]
Je voudrais obtenir le premier (et seul premier) élément qui correspond à ma fonction personnalisée:
_.filterFirst(arr, function(el) { return el.a > 10; }); // make it
Jusque là:
_.first(arr) == {a:1}
_.filter(arr, function(...)) == [{a:11}, {a:15}]
Existe-t-il une solution propre, meilleure que _.first(_.filter(arr, iterator))
, pour le faire?
Vous pouvez utiliser find
:
Parcourt chaque valeur de la liste et renvoie la première qui passe un test de vérité (itérateur), ou indéfini si aucune valeur ne réussit le tester. La fonction retourne dès qu'elle trouve un élément acceptable, et ne traverse pas la liste entière.
En utilisant votre exemple:
var g = _.find(arr, function (x) { return x.a > 10 })
Voir la page principale: http://underscorejs.org
Une autre chose à noter (qui pourrait être votre question) est la fonction chain
pour joindre des appels:
var g = _.chain(arr).filter(function (x) { return x.a > 10 }).first().value()
Notez les appels à filter
et `first 'qui peuvent se suivre sans imbrication.
"_.find" est une bonne solution.
Une solution alternative, peut-être plus rapide, consiste à utiliser "Array.prototype.every" de cette manière:
var match;
arr.every(function(x) { if (x.a > 10) { match = x; return false;} return true; })
_.find - in lodash: https://lodash.com/docs/4.17.10#find
var users = [
{ 'user': 'barney', 'age': 36, 'active': true },
{ 'user': 'fred', 'age': 40, 'active': false },
{ 'user': 'pebbles', 'age': 1, 'active': true }
];
_.find(users, function(o) { return o.age < 40; });
// => object for 'barney'
// The `_.matches` iteratee shorthand.
_.find(users, { 'age': 1, 'active': true });
// => object for 'pebbles'
// The `_.matchesProperty` iteratee shorthand.
_.find(users, ['active', false]);
// => object for 'fred'
// The `_.property` iteratee shorthand.
_.find(users, 'active');
// => object for 'barney'