web-dev-qa-db-fra.com

Obtenir le premier élément d'une collection qui correspond à la fonction d'itérateur

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?

31
ducin

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.

70
Tahir Hassan

"_.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; })
0
Juan Cortines

_.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'
0
BigMan73