---
title: merge – รวมสองอ็อบเจ็กต์เข้าด้วยกัน โดยใช้ base wins principle (shallow merge)
url: https://www.thepexcel.com/functions/n8n/array-functions/merge-n8n/
type: function-explainer
program: n8n
syntax: baseObject.merge(objectToMerge)
date: 2025-12-16
updated: 2025-12-23
scores:
  popularity: 7
  difficulty: 3
  usefulness: 7
---

# merge – รวมสองอ็อบเจ็กต์เข้าด้วยกัน โดยใช้ base wins principle (shallow merge)

> merge() เป็นเมธอดของ n8n ที่รวมอ็อบเจ็กต์สองตัวโดยใช้ base object (อ็อบเจ็กต์แรก) เป็นฐาน เมื่อคีย์ซ

## คำอธิบาย

merge() เป็นเมธอดของ n8n ที่รวมอ็อบเจ็กต์สองตัวโดยใช้ base object (อ็อบเจ็กต์แรก) เป็นฐาน เมื่อคีย์ซ้ำกัน ค่าจาก base จะถูกเก็บไว้ สร้าง object ใหม่ (immutable) ไม่แก้ไข object เดิม ใช้ได้กับการสร้างค่าเริ่มต้น รวมข้อมูล หรือเพิ่ม metadata ให้ workflow results

## Syntax

```excel
baseObject.merge(objectToMerge)
```

**Variant**

```excel
Object.assign({}, obj1, obj2)
```

วิธีทางเลือก ใช้ Object.assign()

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| objectToMerge | Yes | object |  | อ็อบเจ็กต์ที่ต้องการรวมเข้ากับ base object โปรแกรมจะเพิ่มฟิลด์ใหม่จาก objectToMerge เข้าไปใน base object แต่ถ้ามีคีย์ที่ซ้ำกันจะใช้ค่าจาก base object เท่านั้น (base wins principle) |

## เคสการใช้งาน

### รวมข้อมูลผู้ใช้

รวมข้อมูลจากฐานข้อมูลต่างๆ เป็นโปรไฟล์ผู้ใช้เดียว

_เหมาะกับ:_ profile-merging

### สร้างการตั้งค่า

รวมการตั้งค่าจากหลายแหล่งเป็นแหล่งเดียว

_เหมาะกับ:_ config-merging

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: เพิ่มฟิลด์ metadata ให้ API response ในเวิร์กโฟลว์

```excel
{{ $json.userData.merge({fetchedAt: $now, source: 'api', version: '1.0'}) }}
```

**ผลลัพธ์:** `{id: 123, name: 'John', email: 'john@ex.com', fetchedAt: '2024-12-23T10:30:00Z', source: 'api', version: '1.0'}`

รวม user data จาก API response กับ metadata fields (fetchedAt, source, version) เป็นประโยชน์อย่างมากเพื่อติดตามข้อมูลสำหรับ logging และ auditing ของเวิร์กโฟลว์

### 2. ตัวอย่างที่ 2: สร้างค่าเริ่มต้น (base wins principle)

```excel
{{ {timeout: 30, retries: 3, debug: false}.merge($json.settings) }}
```

**ผลลัพธ์:** `{timeout: 30, retries: 3, debug: false, customField: 'value'}`

สร้างค่าเริ่มต้น (defaults) จากนั้น merge เข้ากับ user settings ถ้า user ส่ง timeout=60 ก็จะใช้ค่า default 30 เพราะ base wins principle (safe fallback strategy)

### 3. ตัวอย่างที่ 3: รวม database record กับ form input และเพิ่มข้อมูล audit

```excel
{{ $json.dbRecord.merge({updatedAt: $now, updatedBy: $json.currentUser.email}) }}
```

**ผลลัพธ์:** `{id: 1, name: 'Product', price: 100, updatedAt: '2024-12-23T10:30:00Z', updatedBy: 'admin@example.com'}`

รักษา database fields เดิม (id, name, price) ไว้อย่างปลอดภัย เพิ่มฟิลด์ audit (updatedAt, updatedBy) เพื่อติดตามประวัติการแก้ไขและการอัปเดตของเวิร์กโฟลว์

### 4. ตัวอย่างที่ 4: Base wins - ค่าเดิมไม่ถูกแทนที่

```excel
{{ {role: 'user', verified: true}.merge({role: 'admin', newField: 'value'}) }}
```

**ผลลัพธ์:** `{role: 'user', verified: true, newField: 'value'}`

เมื่อคีย์ 'role' ซ้ำ ค่าจาก base (user) จะถูกเก็บไว้ ไม่ใช่ค่า admin จาก object ที่ merge มา useful สำหรับป้องกันการ escalate permissions

## หมายเหตุเพิ่มเติม

- ⚠️ merge() เป็นการ shallow merge เท่านั้น - ถ้า nested object ซ้ำจะใช้ reference object ตัวเดียว ลองใช้ JSON.stringify + JSON.parse สำหรับการ deep copy ถ้าต้องการให้ nested objects เป็น independent

- Base object มีความสำคัญและเป็นตัวชี้ขาด (base wins principle) - ใช้สำหรับสร้าง safe defaults ที่ไม่ให้ค่าถูก override ได้อย่างไม่ตั้งใจ

- ใช้ keys($json.merged) หรือ Object.keys(merged) เพื่อ debug ว่า properties ไหนอยู่ใน result object ของการ merge

- รวมกับ if() function เพื่อทำการ merge แบบ conditional: {{ $json.user.merge(isAdmin ? {role: 'admin'} : {}) }} เมื่อต้องการเพิ่ม properties แบบมีเงื่อนไข

- ใช้ merge() ร่วมกับ filter() และ map() เพื่อทำการ transform data - เหมาะสำหรับการ merge metadata เข้ากับผลลัพธ์หลัง transformation

## คำถามที่พบบ่อย

**Q: merge() เทียบกับ Object.assign() ต่างกันอย่างไรบ้าง?**

ทั้งคู่ทำการ shallow merge บน object แต่ merge() เป็นเมธอดของ n8n ส่วน Object.assign() เป็นเมธอดของ JavaScript standard ใน n8n expressions ทั้งคู่ใช้ได้และให้ผลลัพธ์เดียวกัน แต่ merge() อ่านง่ายกว่าและเป็นที่รู้จักของผู้ใช้ n8n

**Q: merge() สร้าง object ใหม่หรือแก้ไขอ็อบเจ็กต์เดิม?**

merge() สร้าง object ใหม่ (immutable) ไม่เปลี่ยนแปลง base object เดิมเลย ข้อมูลเดิมยังคงอยู่ในสภาพเดิม หลังจากการ merge เสร็จสิ้น

**Q: merge() สามารถทำการ deep merge กับ nested objects ได้หรือไม่?**

ไม่ได้ เป็นการ shallow merge เท่านั้น ถ้า nested object ซ้ำกันระบบจะใช้ reference object เดียว ถ้าต้องการ deep merge จะต้องใช้ recursive function หรือ JSON.stringify + JSON.parse สำหรับการ deep copy

**Q: ใช้ merge() เมื่อไหร่ในการสร้างเวิร์กโฟลว์ n8n?**

ใช้เมื่อต้องการเพิ่มฟิลด์ metadata (timestamp, source, user) ให้กับข้อมูล สร้างค่าเริ่มต้น (defaults) เพื่อป้องกัน undefined รวมข้อมูลจาก API หลายตัว หรือเพิ่มข้อมูล audit fields (createdAt, updatedBy) เพื่อติดตามประวัติการแก้ไข

**Q: ถ้า objectToMerge มีจำนวน properties มากมาย ต้องทำอย่างไร?**

merge() รองรับ object ขนาดใหญ่ได้ ถ้า object มี nested objects ต้องระวัง shallow merge behavior ลองใช้ keys() function เพื่อ debug ว่า properties ไหนถูก merge เข้าไป

## แหล่งข้อมูลเพิ่มเติม

- [เอกสาร n8n Expressions - คำอธิบายการใช้ expressions ใน n8n](https://docs.n8n.io/code/expressions/) _(article)_
- [MDN: Object.assign() - เมธอด JavaScript standard สำหรับ merge objects](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) _(article)_
- [คู่มือการแปลง Object ใน n8n - วิธี transform และ manipulate objects](https://docs.n8n.io/code/builtin/data-transformation-functions/objects/) _(article)_

---

_Source: [https://www.thepexcel.com/functions/n8n/array-functions/merge-n8n/](https://www.thepexcel.com/functions/n8n/array-functions/merge-n8n/)_
