如何在同一個回應中去除 API 返回的職缺清單中的重複項目

描述問題/錯誤/問題

每個職位空缺都有一個唯一的 external_id,但有些在同一個 API 回應中出現多次。

我的目標:

允許來自每個職位空缺的恰好一個項目
過濾出同一筆內容中的重複項目
不進行 Supabase 檢查,因為資料庫仍然是空的

我正在以「為所有項目執行一次」模式使用代碼節點來檢測重複項目。

錯誤訊息是什麼(如果有的話)?

請分享您的工作流程

(在您的畫布上選擇節點,並使用鍵盤快速鍵 CMD+C/CTRL+C 和 CMD+V/CTRL+V 來複製和貼上工作流程。)

分享最後一個節點返回的輸出

關於您的 n8n 設定的資訊

  • n8n 版本:
  • 資料庫(預設:SQLite):
  • n8n EXECUTIONS_PROCESS 設定(預設:own、main):
  • 執行 n8n 的方式(Docker、npm、n8n cloud、桌面應用程式):
  • 作業系統:

@haajj3012 在「為所有項目執行一次」模式下的程式碼節點:

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;
});

針對每個唯一的 external_id 輸出一個項目,丟棄其餘的。如果你想保留特定的一個項目(例如依日期最新、版本最高等),而不是「首次出現」的話,告訴我一聲。

@haajj3012
@achamm 的程式碼運作得完美無缺。我再補充一個
無程式碼選項,如果你傾向在工作流程中保持視覺化的話:

n8n 內建的 Remove Duplicates 節點可以完全達成這個目的,
完全不需要寫任何 javascript。設定方式:

  1. 在你的 api 呼叫之後放置一個 Remove Duplicates 節點
  2. operation:「Remove Items With Same Field Value」
  3. compare field:external_id

它會在一個節點內將陣列過濾成唯一的項目,之後在畫布上
偵錯時會更容易發現。

不管你選擇哪個做法,都有幾個小邊界情況值得處理:

  • 如果 external_id 在某些項目上遺失或為 null,
    程式碼和節點都會把所有 null 視為彼此的重複項。
    通常沒問題,但如果你想保留 null,就在去重步驟前
    加一個過濾器來分離它們。
  • 如果 api 在某些項目上以數字形式回傳 id,
    在其他項目上以字串形式回傳,兩種做法都會把 "123"
    123 視為不同的值。在程式碼中快速使用
    String(item.json.external_id)(或用 Set 節點來標準化型別)
    就能解決。

既然你提到 supabase 稍後會加入 — 當你確實加入時,
最乾淨的做法是先在承載內進行去重
(你現在做的),然後作為第二步再對 supabase 進行去重。
這樣邏輯保持乾淨,也容易各層獨立測試。

很棒的回答,來自 @achamm@Dharmendra_Kumar – Code 節點中的 Set + filter 模式很穩健,而 Remove Duplicates 的視覺化選項對於這個使用情境來說正好。

由於 n8n 已經可以非常好地開箱即用地支持這個場景,我個人會避免在這裡使用 Code 節點,而是完全依賴內建節點。這樣可以讓工作流程更容易讀懂,通常長期來看也更穩定。

對於你的具體目標(「在同一個 payload 中,每個 external_id 恰好一項,DB 仍為空」),你可以這樣設定 Remove Duplicates

  • 在 API 節點之後新增一個 Remove Duplicates 節點。
  • Operation 設為 Remove Items Repeated Within Current Input
  • 設定 CompareSelected Fields,並選擇 external_id 作為欄位。

這樣會在目前執行中只保留每個 external_id 的第一項,並捨棄所有進一步的重複項 -- 正好是你描述的情況,不需要任何額外的程式碼或資料庫檢查。

稍後當你開始使用 Supabase,並且也想要跳過你在之前執行中已經處理過的職缺時,你可以在 Remove Items Processed in Previous Executions 模式中連接第二個 Remove Duplicates 節點。這樣你就能得到一個乾淨的「payload 內去重 → 對比歷史記錄去重」模式,全部使用原生節點。