Je me demande s'il existe un moyen connu, intégré/élégant de trouver le premier élément d'un tableau JS correspondant à une condition donnée. Un équivalent en C# serait Liste.Rechercher .
Jusqu'à présent, j'ai utilisé un combo à deux fonctions comme celui-ci :
// Returns the first element of an array that satisfies given predicate
Array.prototype.findFirst = function (predicateCallback) {
if (typeof predicateCallback !== 'function') {
return undefined;
}
for (var i = 0; i < arr.length; i++) {
if (i in this && predicateCallback(this[i])) return this[i];
}
return undefined;
};
// Check if element is not undefined && not null
isNotNullNorUndefined = function (o) {
return (typeof (o) !== 'undefined' && o !== null);
};
Et puis je peux utiliser :
var result = someArray.findFirst(isNotNullNorUndefined);
Mais comme il y a tant de méthodes de tableau de style fonctionnel dans ECMAScript peut-être existe-t-il déjà quelque chose de ce genre ? J'imagine que beaucoup de gens doivent mettre en œuvre des trucs comme ça tout le temps...
6 votes
Il n'y a pas de méthode intégrée, mais il existe des bibliothèques utilitaires qui se rapprochent de cette fonctionnalité, telles que documentcloud.github.com/underscore
0 votes
Underscore.js est en effet très joli ! Et il a find(). Merci !
1 votes
Juste pour que vous sachiez, vous pouvez réduire ça :
return (typeof (o) !== 'undefined' && o !== null);
à cecireturn o != null;
. Ils sont exactement équivalents.1 votes
Bon à savoir. Mais vous savez, je me méfie des opérateurs de coercition comme != ou ==. Je ne pourrais même pas le tester facilement, car il faudrait que je vérifie d'une manière ou d'une autre qu'il n'y a pas d'autre valeur qui soit contrainte à null de cette manière... :) Je suis donc très chanceux d'avoir une bibliothèque qui m'a permis de supprimer complètement cette fonction... :)
0 votes
Honnêtement, je dirais que c'est une solution assez élégante. La solution la plus proche que j'ai trouvée est Array.prototype.some qui essaie de trouver si un élément satisfait à une condition donnée que vous lui passez sous la forme d'une fonction. Malheureusement, cette fonction renvoie un booléen au lieu de l'indice ou de l'élément. Je recommanderais votre solution plutôt que d'utiliser une bibliothèque, car les bibliothèques ont tendance à être beaucoup plus grandes et à contenir des choses que vous n'utiliserez pas, alors que je préfère garder les choses légères (puisque vous n'utiliserez peut-être qu'une seule fonction parmi la série qu'elle fournit).
0 votes
D'après mon expérience, trouver la première correspondance dans une collection est généralement bogué et provoque un comportement incohérent (à moins que les éléments soient ordonnés selon une certaine logique, ce qui n'est pas la majorité des cas). Ce dont vous avez généralement besoin, c'est de trouver le seul élément qui correspond et pour cela, il n'y a pas de méthode native JS (qui jette les données en cas de correspondances multiples).