Diff de tableaux en javascript.
###Introduction
Il y a peu de temps au travail, j'ai eu besoin de faire une différence entre
deux tableaux en javascript[^1]. Je n'ai pas trouvé de fonction native, j'ai
donc eu besoin de faire une petite fonction.
###Fonction
Rendons à César ce qui lui appartient, j'ai trouvé cette solution sur
stackoverflow:
Array.prototype.diff = function(a) {
return this.filter(function(i) {
return !(a.indexOf(i) > -1);
});
};
L'utilisation de prototype nous permet donc d'hériter des propriétés de l'objet
Array dans le cas présent:
[1,2,3,4,5,6].diff( [3,4,5] );
Il est possible ensuite d'appeler notre fonction sur un tableau, en passant en
paramètre un tableau.
###Anecdote
Je suis me suis rendu à cette occassion qu'à priori le moteur V8 de google est
plus permissif que celui de firefox. Pour créer un de mes tableaux, je
récupérer les valeurs d'une table en jQuery, c'était des valeurs entière sous
forme de string, j'avais oublié de caster[^2] mes valeurs en entier avant
d'appeler ma fonction, mon autre tableau contenait des entiers. Sous chromium,
ça fonctionner malgré tout très bien, pas sous firefox.
###En Python
Pour m'amuser, j'ai écrit cette fonction en Python, je suis plus à l'aise avec
ce langage, ça m'a donc pris quelques secondes:
def diff(list1, list2):
return [ item for item in list1 if not item in list2 ]
Il est aussi possible d'utiliser filter:
def diff(list1, list2):
return filter(lambda x: x if x not in list1, list2)
Je préfère la version utilisant une listes en compréhension. Je trouve ça plus
pythonic et lisible, de plus ça évite un appel de fonction.
###Conclusion
Une solution en quelques lignes pour une diff en javascript. Il en existe
certainement d'autres, mais cette solution me suffit et me convient
parfaitement.
[^1]: Pour supprimer des lignes d'une table, lors d'un appel ajax
[^2]: De convertir mes valeurs