Skip to content

Merge Method

The merge() method merges the given array or collection with the original collection. For arrays, it appends the values. For objects, it combines properties, with later values overwriting existing ones.

Basic Syntax

typescript
// Merge with array
collect(items).merge(array: any[])

// Merge with another collection
collect(items).merge(collection: Collection<T>)

// Merge with object
collect(items).merge(object: Record<string, any>)

Examples

Basic Usage

typescript
import { collect } from 'ts-collect'

// Merging arrays
const numbers = collect([1, 2, 3])
const merged = numbers.merge([4, 5, 6])
console.log(merged.all()) // [1, 2, 3, 4, 5, 6]

// Merging objects
const defaults = collect({ name: 'Default', type: 'user' })
const custom = { name: 'Custom', role: 'admin' }
console.log(defaults.merge(custom).all())
// { name: 'Custom', type: 'user', role: 'admin' }

Working with Objects

typescript
interface User {
  id?: number
  name?: string
  settings?: Record<string, any>
}

const baseUser: User = collect({
  name: 'John',
  settings: {
    theme: 'light',
    notifications: true
  }
})

const updates: User = {
  id: 1,
  settings: {
    theme: 'dark'
  }
}

const updatedUser = baseUser.merge(updates)
console.log(updatedUser.all())
// {
//   id: 1,
//   name: 'John',
//   settings: {
//     theme: 'dark',
//     notifications: true
//   }
// }

Real-world Examples

Configuration Merging

typescript
interface Config {
  database: {
    host?: string
    port?: number
    credentials?: {
      username?: string
      password?: string
    }
  }
  cache?: {
    enabled?: boolean
    ttl?: number
  }
}

const defaultConfig = collect<Config>({
  database: {
    host: 'localhost',
    port: 5432,
    credentials: {
      username: 'default',
      password: 'default'
    }
  },
  cache: {
    enabled: false,
    ttl: 3600
  }
})

const environmentConfig: Partial<Config> = {
  database: {
    host: 'production.db',
    credentials: {
      username: 'prod_user'
    }
  }
}

const finalConfig = defaultConfig.merge(environmentConfig)

API Response Handling

typescript
interface ApiResponse {
  data: any
  meta: {
    page?: number
    total?: number
    timestamp?: string
  }
}

class ApiHandler {
  private defaultResponse = collect<ApiResponse>({
    data: null,
    meta: {
      page: 1,
      total: 0,
      timestamp: new Date().toISOString()
    }
  })

  processResponse(response: Partial<ApiResponse>): ApiResponse {
    return this.defaultResponse.merge(response).all()
  }
}

// Usage
const handler = new ApiHandler()
const response = handler.processResponse({
  data: ['item1', 'item2'],
  meta: { total: 2 }
})

Advanced Usage

Deep Merging State

typescript
interface AppState {
  user: {
    profile?: {
      name?: string
      email?: string
      preferences?: {
        language?: string
        timezone?: string
      }
    }
    settings?: Record<string, any>
  }
}

class StateManager {
  private state = collect<AppState>({
    user: {
      profile: {
        preferences: {
          language: 'en',
          timezone: 'UTC'
        }
      },
      settings: {}
    }
  })

  updateState(newState: Partial<AppState>) {
    this.state = this.state.merge(newState)
    return this.state
  }
}

// Usage
const manager = new StateManager()
manager.updateState({
  user: {
    profile: {
      name: 'John',
      preferences: {
        language: 'es'
      }
    }
  }
})

Working with Collections

typescript
interface Task {
  id: number
  status: string
  priority: number
}

const initialTasks = collect<Task>([
  { id: 1, status: 'pending', priority: 1 },
  { id: 2, status: 'completed', priority: 2 }
])

const newTasks = collect<Task>([
  { id: 3, status: 'pending', priority: 3 }
])

const allTasks = initialTasks.merge(newTasks)

Type Safety

typescript
interface TypedObject {
  required: string
  optional?: number
  nested?: {
    value?: string
  }
}

const base = collect<TypedObject>({
  required: 'base',
  nested: {
    value: 'original'
  }
})

// Type-safe merging
const merged = base.merge({
  optional: 42,
  nested: {
    value: 'updated'
  }
})

// TypeScript ensures type safety
const result: TypedObject = merged.all()

Return Value

  • Returns a new Collection instance containing the merged items
  • For arrays: concatenates the values
  • For objects:
    • Combines properties from both objects
    • Later values overwrite earlier ones
    • Maintains nested structure
  • Original collection remains unchanged

Released under the MIT License.