大家好,我是 N8N大学 的首席主编。在低代码自动化的世界里,数据格式的转换几乎是每天都要面对的“家常便饭”。今天,我们要聊一个非常经典且高频的需求:如何利用 n8n 的 Set 节点,将一组数组(Array)元素转换为逗号分隔的字符串。
很多刚接触 n8n 的朋友在处理数据库查询结果、API 返回的列表,或者 Webhook 接收到的多条数据时,都会遇到一个头疼的问题:数据是一堆对象组成的数组,但下游的系统(比如邮件发送、SQL 插入、或者简单的文本通知)只接受一个用逗号拼接好的字符串。别担心,这正是 Set 节点大显身手的时候。
场景导入:为什么我们需要这个技巧?
想象一下这个场景:你通过一个 HTTP Request 节点拉取了某个电商后台的“待发货订单 ID 列表”,返回的数据结构大概是这样的:
[{"id": 1001}, {"id": 1002}, {"id": 1003}]
现在,你需要把这些 ID 发送给物流系统,或者在日志中打印出来。如果你直接把整个数组塞进消息体,对方可能无法解析。你需要的其实是这个字符串:"1001,1002,1003"。
如果手动写代码节点,虽然也能实现,但对于简单的字符串拼接,Set 节点配合 n8n 的表达式(Expression)语法,往往能以更优雅、更直观的方式解决问题。这就是我们今天要攻克的实战技巧。
核心实操:三步搞定数组转字符串
在本节中,笔者将带你拆解具体的操作步骤。我们将假设你已经拥有一个包含数组数据的输入(例如来自 Webhook 或上一个节点)。
步骤一:准备数据源
为了演示,我们使用 Set 节点 模拟一个简单的输入数据。在实际工作中,这个数据可能来自上一个节点的 $.json.items 字段。
创建一个 Set 节点,设置输出字段为 items,值为 JSON 格式:
[
{"name": "苹果", "id": 1},
{"name": "香蕉", "id": 2},
{"name": "橙子", "id": 3}
]
这样,我们就有了一个包含 3 个对象的数组。
步骤二:引入 Set 节点进行转换
这是最关键的一步。我们在数据流的下游添加一个新的 Set 节点(注意:n8n 中有两个 Set 节点,一个是旧版的 "Set",一个是新版的 "Set",这里我们使用新版,功能更强大)。
点击 Set 节点的 "+ Add field" 按钮,设置如下:
- Field Name (字段名):
result_string(这是你要输出的新字段) - Value (值): 点击输入框右侧的 "Expression" 选项卡
步骤三:编写核心表达式
这是 N8N大学 的核心干货。在表达式编辑器中,我们需要利用 JavaScript 的 map() 和 join() 方法。
请在表达式输入框中粘贴以下代码:
{{ $json.items.map(item => item.name).join(', ') }}
代码解析:
$json.items: 获取上一个节点传来的 JSON 数据中的items数组。.map(item => item.name): 遍历数组,提取每个对象中的name属性,生成一个新的字符串数组["苹果", "香蕉", "橙子"]。.join(', '): 将这个新数组用 ", " (逗号加空格) 连接成一个字符串。
执行节点后,你会看到输出结果中多了一个字段 result_string,其值为:"苹果, 香蕉, 橙子"。
避坑指南:实战中容易忽略的细节
作为过来人,笔者必须提醒你注意以下两个实战细节,否则很容易在复杂的流程中踩坑。
1. 数据扁平化问题
在 n8n 的表达式中,数据路径(Data Path) 是核心。如果你发现表达式报错提示 Cannot read property 'map' of undefined,通常是因为你的数据层级不对。
请务必使用 UI 面板的“点选”功能。在表达式编辑器右侧,你会看到一个“Data”面板,逐级展开 json -> items,然后点击 Insert Expression。这能避免手写路径时的拼写错误。
2. 处理空数组或 null 值
如果上游传来的数组是空的([]),或者字段本身是 null,直接调用 .join() 虽然不会报错,但可能会输出一个空字符串,这在某些业务逻辑中是不被允许的。
为了代码的健壮性,建议使用短路运算或三元表达式。例如:
{{ $json.items && $json.items.length > 0 ? $json.items.map(item => item.id).join(',') : 'N/A' }}
这段逻辑的意思是:如果 items 存在且长度大于0,则执行拼接;否则返回 'N/A'。
进阶技巧:当数组在深层嵌套中时
有时候,数据结构并不像我们演示的那么平整。例如,数据可能长这样:
{ "data": { "products": [ {"sku": "A001"}, {"sku": "B002"} ] } }此时,你的表达式需要相应调整路径:
{{ $json.data.products.map(p => p.sku).join('-') }}这里我们将分隔符改为了短横线
-。记住,Set 节点的表达式支持标准的 JavaScript 数组操作,这意味着你可以在这里做任何你擅长的数组处理。FAQ 问答
Q1: 如果我想保留数组里对象的所有属性(比如 "苹果(id:1)"),该怎么写?
A: 可以在 map 函数中返回模板字符串:
{{ $json.items.map(item => `${item.name}(id:${item.id})`).join(', ') }}
这利用了 ES6 的模板字符串语法,非常灵活。Q2: Set 节点和 Code 节点有什么区别?为什么不用 Code 节点?
A: Code 节点更强大,但配置稍显繁琐(需要写完整的函数)。Set 节点配合表达式更加轻量、直观,适合处理简单的映射和转换。对于“数组转字符串”这种单一逻辑,Set 节点在可视化和维护上更有优势。Q3: 分隔符能用换行符吗?
A: 可以。在 n8n 的表达式中,换行符需要用转义字符n。例如:
{{ $json.items.map(item => item.name).join('n') }}
这在生成纯文本邮件正文时非常有用。总结与资源
将数组转换为逗号分隔字符串是 n8n 数据处理中的基础操作,但掌握它能为你后续处理更复杂的数据清洗打下坚实基础。核心在于理解 Array.prototype.map() 和 Array.prototype.join() 在 n8n 表达式中的结合使用。
如果你在实操过程中遇到报错,或者有更刁钻的数据结构需要处理,欢迎在 N8N大学 的社区中留言。记住,低代码自动化的精髓不在于写多少行代码,而在于如何用最简单的逻辑解决最实际的问题。