Javascript: indexof() très lent a s'exécuter
Il y a une fonction bien utile de JavaScript qui permet de savoir si un élément se trouve dans un tableau. C'estArray.indexOf()
.Par exemple :
var fruits = ['banane', 'pomme', 'poire', 'peche', 'abricot'];
var index_des_bananes = fruits.indexOf('banane'));
console.log('index_des_bananes = ' + index_des_bananes); // index_des_bananes = 0
var index_des_poire = fruits.indexOf('poire'));
console.log('index_des_poire = ' + index_des_poire); // index_des_poire = 2
var index_des_ananas = fruits.indexOf('banane'));
console.log('index_des_ananas = ' + index_des_ananas); // index_des_ananas = -1
Quand notre application se complexifie, nous avons tous tendance a avoir des tableaux d'objets dans nos variables.Par exemple :
var User = {
prenom: 'Jean',
nom: 'Michel',
age: 18,
...
amis: [User1, User2, ...]
}
Ces objets peuvent être de simples objets JavaScript ou des objets Mongoose ou n'importe quel type d'objet, en fonction de la structure de votre application.Et c'est là qu'intervient le moment le plus critique !
Étant tous un peu fainéant sur les bords, si nous voulons savoir si un
UserX
est déjà dans la liste d'amis d'un autre User1
, nous allons tous tendance à vouloir utiliser :if (User1.amis.indexOf(UserX) !== -1) {
// UserX est déjà dans la liste d'amis de User1
}
else {
// UserX n'est pas encore dans la liste d'amis de User1
}
Et là, l'exécution de notre code ralentit de quelques centaines de millisecondes voir d'une seconde. Pour une petite application personnel, rien de grave, mais dés que nous avons une application avec un nombre d'utilisateur non négligeable, cette méthode impacte fortement les performances de notre application !Le contournement de cette méthode est pourtant tout simple :
var estDansLaListeDAmis = false;
User1.amis.some(function (User, index, array) {
if (User1._id === User._id) {
estDansLaListeDAmis = true
return true
}
})
Explications
Array.indexOf()
, quand il est appliqué sur un tableau d'objet, va effectuer des opérations "cachées". Ces opérations sont par exemple le recast de l'objet en Array, le parcours de tous les champs de l'objet...etc.