描述問題/錯誤/問題
每個職位空缺都有一個唯一的 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。設定方式:
- 在你的 api 呼叫之後放置一個 Remove Duplicates 節點
- operation:「Remove Items With Same Field Value」
- 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。
- 設定 Compare →
Selected Fields,並選擇 external_id 作為欄位。
這樣會在目前執行中只保留每個 external_id 的第一項,並捨棄所有進一步的重複項 -- 正好是你描述的情況,不需要任何額外的程式碼或資料庫檢查。
稍後當你開始使用 Supabase,並且也想要跳過你在之前執行中已經處理過的職缺時,你可以在 Remove Items Processed in Previous Executions 模式中連接第二個 Remove Duplicates 節點。這樣你就能得到一個乾淨的「payload 內去重 → 對比歷史記錄去重」模式,全部使用原生節點。