PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

Hobbestigrou : Diff de tableaux en javascript.

dimanche 2 juin 2013 à 23:32

Introduction

Il y a peu de temps au travail, j'ai eu besoin de faire une différence entre deux tableaux en javascript1. 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 caster2 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 ↩

Gravatar de Hobbestigrou
Original post of Hobbestigrou.Votez pour ce billet sur Planet Libre.