【n8n教程】:Sort节点,数据排序的秘诀
在处理自动化工作流时,您经常会遇到需要整理数据的情况。无论是按价格排列产品、按日期组织事件,还是随机打乱列表,Sort节点都是您的得力助手。本教程将帮助您快速上手n8n的Sort节点,学会如何灵活运用三种排序方式。
什么是Sort节点?
Sort节点用于组织和重新排列数据列表。它基于JavaScript的Array.sort()方法,支持三种排序模式:
- Simple(简单):按升序或降序排列单个或多个字段
- Random(随机):随机打乱列表顺序
- Code(代码):使用自定义JavaScript代码实现复杂排序逻辑
核心概念
Sort节点在处理数组数据时,会将元素转换为字符串进行字典序比较。例如,数字"100"会排在"2"前面(因为"1"小于"2")。因此,正确配置字段类型很关键。
三种排序模式详解
1. Simple(简单排序)- 最常用
何时使用:当您需要按一个或多个字段进行标准的升序/降序排列时
配置步骤:
- 在Sort节点中,选择 Type → Simple
- 点击 Add Field To Sort By 按钮
- 输入要排序的 字段名称(例如:
price、name、createdAt) - 选择排序顺序:
- Ascending(升序):从小到大、从A到Z
- Descending(降序):从大到小、从Z到A
进阶选项:
- Disable Dot Notation:默认启用点号表示法(如
user.email),可以引用嵌套字段。如果字段名本身包含点号,需要关闭此选项。
示例:按价格升序排列产品
字段名:price
顺序:Ascending
结果:最便宜的产品排在最前
2. Random(随机排序)
何时使用:当您需要随机打乱列表顺序时,常用于测试或随机抽样
配置步骤:
- 选择 Type → Random
- 直接运行工作流
- 每次执行都会产生不同的随机顺序
实用场景:
- 随机选择幸运用户
- 测试工作流处理随机数据的能力
- AB测试时的随机用户分配
3. Code(代码排序)- 高级功能
何时使用:需要实现复杂的排序逻辑,例如按多个条件排序或自定义排序规则
配置步骤:
- 选择 Type → Code
- 在代码框中编写JavaScript排序逻辑
- 必须返回排序后的数组
常见代码模式:
按数字字段排序:
const sortedArr = items.sort((a, b) => {
return a.json.price - b.json.price;
});
return sortedArr;
按字符串字段排序:
const sortedArr = items.sort((a, b) => {
let a_name = a.json.name.toLowerCase();
let b_name = b.json.name.toLowerCase();
if (a_name < b_name) return -1;
if (a_name > b_name) return 1;
return 0;
});
return sortedArr;
实战案例:电商产品排序工作流
下面是一个完整的可执行工作流,展示如何使用Sort节点对产品数据进行排序。
场景
一个电商平台需要:
- 获取产品列表(包含名称和价格)
- 按价格升序排列
- 提取前3个最便宜的产品
工作流JSON代码
将以下JSON代码复制到n8n中(使用 Import from File 或直接粘贴到画布上):
{
"name": "电商产品排序工作流",
"nodes": [
{
"parameters": {},
"name": "Manual",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [250, 300]
},
{
"parameters": {
"functionCode": "return [\n { json: { name: 'Gaming Laptop', price: 1200, category: 'Electronics' } },\n { json: { name: 'Wireless Mouse', price: 45, category: 'Accessories' } },\n { json: { name: '4K Monitor', price: 399, category: 'Electronics' } },\n { json: { name: 'Mechanical Keyboard', price: 150, category: 'Accessories' } },\n { json: { name: 'USB-C Hub', price: 89, category: 'Accessories' } },\n { json: { name: 'Laptop Stand', price: 65, category: 'Accessories' } }\n];"
},
"name": "Code - 产品数据",
"type": "n8n-nodes-base.code",
"typeVersion": 1,
"position": [450, 300]
},
{
"parameters": {
"type": "simple",
"fields": [
{
"name": "price",
"order": "asc"
}
]
},
"name": "Sort - 按价格升序",
"type": "n8n-nodes-base.sort",
"typeVersion": 1,
"position": [650, 300]
},
{
"parameters": {
"operation": "limit",
"maxItems": 3,
"keep": "first"
},
"name": "Limit - 只保留前3个",
"type": "n8n-nodes-base.limit",
"typeVersion": 1,
"position": [850, 300]
}
],
"connections": {
"Manual": {
"main": [
[
{
"node": "Code - 产品数据",
"type": "main",
"index": 0
}
]
]
},
"Code - 产品数据": {
"main": [
[
{
"node": "Sort - 按价格升序",
"type": "main",
"index": 0
}
]
]
},
"Sort - 按价格升序": {
"main": [
[
{
"node": "Limit - 只保留前3个",
"type": "main",
"index": 0
}
]
]
}
}
}
工作流执行步骤
-
Manual Trigger(手动触发器)
- 点击"Execute Workflow"启动工作流
-
Code Node - 产品数据
- 生成样本产品数据(包含名称、价格、分类)
-
Sort Node - 按价格升序
- 字段名:
price - 顺序:
Ascending - 结果:产品按价格从低到高排列
- 字段名:
-
Limit Node - 只保留前3个
- 最大项目数:
3 - 保留方式:
first - 结果:只显示最便宜的3个产品
- 最大项目数:
预期输出
[
{ "name": "Wireless Mouse", "price": 45, "category": "Accessories" },
{ "name": "Laptop Stand", "price": 65, "category": "Accessories" },
{ "name": "USB-C Hub", "price": 89, "category": "Accessories" }
]
进阶技巧
按多个字段排序
当您需要按多个条件排序(如先按分类,再按价格)时:
{
"type": "simple",
"fields": [
{
"name": "category",
"order": "asc"
},
{
"name": "price",
"order": "asc"
}
]
}
规则:列表中第一个字段优先排序,如果出现相同值,则按第二个字段排序,以此类推。
处理日期排序
对于日期字段,建议使用Code模式确保准确性:
const sortedArr = items.sort((a, b) => {
const dateA = new Date(a.json.createdAt);
const dateB = new Date(b.json.createdAt);
return dateB - dateA; // 最新的日期优先
});
return sortedArr;
结合IF节点实现条件排序
IF条件检查 → 不同排序规则 → 合并结果
根据不同条件应用不同的排序方式,增强工作流的智能性。
常见问题解决
问题1:数字排序不正确
症状:[1, 10, 2, 20] 而不是 [1, 2, 10, 20]
原因:数据被作为字符串比较
解决:在Code模式中使用数字比较
items.sort((a, b) => a.json.price - b.json.price)
问题2:嵌套字段无法排序
症状:无法按 user.name 排序
解决:确保"Disable Dot Notation"未被开启(保持默认),或在Code模式中访问嵌套属性:
items.sort((a, b) => {
return a.json.user.name.localeCompare(b.json.user.name);
})
问题3:排序后数据丢失
原因:Sort节点只重新排列,不修改数据结构
检查:确认前一个节点正确输出了所有数据
最佳实践
✅ 务必做的事:
- 在执行前一个节点后再配置Sort,这样可以直接拖拽字段名
- 对大型数据集先进行过滤,再排序(性能更优)
- 结合Limit或Slice节点获取Top N结果
- 使用Code模式处理复杂排序逻辑
❌ 避免做的事:
- 混淆Sort与Group操作(Sort只排列,Group才分组)
- 忘记测试特殊值(空值、特殊字符等)
- 在没有明确业务需求的情况下随意使用Random模式
总结
| 模式 | 最佳场景 | 复杂度 |
|---|---|---|
| Simple | 单字段或少数字段排序 | 低 |
| Random | 数据随机化 | 低 |
| Code | 自定义逻辑、复杂条件 | 高 |
通过本教程,您已经掌握了n8n Sort节点的核心用法。现在可以在您的工作流中灵活应用,构建更加智能的数据处理系统!
16万+

被折叠的 条评论
为什么被折叠?



