Comment dédupliquer une liste de postes vacants d'une réponse API au sein d'une même charge utile

Décrire le problème/l’erreur/la question

Chaque offre d’emploi possède un identifiant external_id unique, mais certains apparaissent plusieurs fois dans la même réponse API.

Mon objectif :

Autoriser exactement un élément par offre d’emploi
Filtrer les doublons au sein de la même charge utile
Sans vérification Supabase, car la base de données est encore vide

J’utilise un nœud Code en mode « Exécuter une fois pour tous les éléments » pour détecter les doublons.

Quel est le message d’erreur (le cas échéant) ?

Veuillez partager votre workflow

(Sélectionnez les nœuds sur votre canevas et utilisez les raccourcis clavier CMD+C/CTRL+C et CMD+V/CTRL+V pour copier et coller le workflow.)

Partager la sortie renvoyée par le dernier nœud

Informations sur votre configuration n8n

  • Version de n8n :
  • Base de données (par défaut : SQLite) :
  • Paramètre n8n EXECUTIONS_PROCESS (par défaut : own, main) :
  • Exécution de n8n via (Docker, npm, n8n cloud, application de bureau) :
  • Système d’exploitation :

@haajj3012 Nœud Code en mode « Exécuter une fois pour tous les éléments » :

const seen = new Set();
return $input.all().filter(item => {
  const id = item.json.external_id;
  if (seen.has(id)) return false;
  seen.add(id);
  return true;
});

émet un élément par external_id unique, supprime les autres. Si tu veux en garder un SPÉCIFIQUE (le plus récent par date, la version la plus élevée, etc.) à la place du « premier vu », fais-le-moi savoir.

Salut @haajj3012,
@achamm’s le code fonctionne parfaitement. je viens juste d’ajouter une
option sans code au cas où tu préfèrerais garder les choses visuelles dans
le workflow :

n8n a un nœud Remove Duplicates intégré qui fait exactement
cela sans écrire de javascript. mise en place :

  1. dépose un nœud Remove Duplicates après ton appel api
  2. opération : « Remove Items With Same Field Value »
  3. champ de comparaison : external_id

il va filtrer le tableau jusqu’aux éléments uniques en un seul nœud, plus facile
à repérer sur le canvas plus tard quand tu vas déboguer.

quelques petits cas limites qui valent le coup d’être traités avec l’une ou
l’autre approche :

  • si external_id est jamais manquant ou null sur certains éléments, le code
    et le nœud traiteront tous les nulls comme des doublons
    les uns des autres. généralement ok, mais si tu veux garder les nulls,
    ajoute un filtre avant l’étape de déduplication pour les séparer.
  • si l’api retourne jamais l’id en tant que nombre sur certains éléments
    et en tant que chaîne sur d’autres, les deux approches traiteront "123"
    et 123 comme différents. un rapide String(item.json.external_id)
    dans le code (ou un nœud Set pour normaliser le type) règle ça.

comme tu as mentionné que supabase arrive plus tard — quand tu l’ajouteras,
le pattern le plus propre c’est de dédupliquer dans le payload d’abord
(ce que tu fais en ce moment), puis de dédupliquer par rapport à supabase comme
deuxième étape. ça garde la logique propre et facile à tester chaque couche
indépendamment.

Excellentes réponses de @achamm et @Dharmendra_Kumar – le pattern Set + filter dans le nœud Code est solide, et l’option visuelle avec Remove Duplicates est exactement ce qu’il faut pour ce cas d’usage.

Puisque n8n supporte déjà très bien ce scénario directement, je personnellement éviterais un nœud Code ici et je m'appuierais entièrement sur le nœud intégré. Cela rend le workflow plus facile à lire et généralement plus stable à long terme.

Pour votre objectif spécifique (« exactement un élément par external_id au sein de la même payload, DB toujours vide »), vous pouvez configurer Remove Duplicates comme ceci :

  • Ajoutez un nœud Remove Duplicates directement après votre nœud API.
  • Définissez Operation sur Remove Items Repeated Within Current Input.
  • Définissez CompareSelected Fields et choisissez external_id comme champ.

Cela conservera uniquement le premier élément pour chaque external_id dans l'exécution actuelle et supprimera tous les doublons ultérieurs -- exactement ce que vous avez décrit, sans code supplémentaire ni vérification de base de données.

Plus tard, quand vous commencerez à utiliser Supabase et que vous voudrez également ignorer les offres que vous avez déjà traitées dans les exécutions précédentes, vous pouvez chaîner un second nœud Remove Duplicates en mode Remove Items Processed in Previous Executions. De cette façon, vous obtenez un pattern propre « déduplications au sein de la payload → déduplication par rapport à l'historique », le tout avec des nœuds natifs.