Skip to content

union Method ​

The union() method returns a new collection containing all unique items from both the original collection and the given array or collection. It effectively combines two sets of data while removing duplicates.

Basic Syntax ​

typescript
collect(items).union(other: T[] | Collection<T>): Collection<T>

Examples ​

Basic Usage ​

typescript
import { collect } from 'ts-collect'

// Simple array union
const items1 = collect([1, 2, 3, 4])
const items2 = [3, 4, 5, 6]

const combined = items1.union(items2)
console.log(combined.all())
// [1, 2, 3, 4, 5, 6]

// Object union
const products1 = collect([
  { id: 1, name: 'Widget' },
  { id: 2, name: 'Gadget' }
])
const products2 = [
  { id: 2, name: 'Gadget' },
  { id: 3, name: 'Tool' }
]

const allProducts = products1.union(products2)

Working with Objects ​

typescript
interface Product {
  sku: string
  name: string
  category: string
  price: number
}

const localInventory = collect<Product>([
  { sku: 'WID-1', name: 'Widget', category: 'tools', price: 10 },
  { sku: 'GAD-1', name: 'Gadget', category: 'electronics', price: 20 }
])

const onlineInventory = [
  { sku: 'GAD-1', name: 'Gadget', category: 'electronics', price: 20 },
  { sku: 'TOL-1', name: 'Tool', category: 'tools', price: 30 }
]

// Combine inventories without duplicates
const totalInventory = localInventory.union(onlineInventory)

Real-world Examples ​

Multi-Channel Inventory Manager ​

typescript
interface InventoryItem {
  sku: string
  name: string
  quantity: number
  location: string
  lastUpdated: string
}

class MultiChannelInventory {
  combineInventories(
    channels: Record<string, Collection<InventoryItem>>
  ): Collection<InventoryItem> {
    let combinedInventory = collect<InventoryItem>([])

    Object.values(channels).forEach(channelInventory => {
      combinedInventory = combinedInventory.union(channelInventory.all())
    })

    return combinedInventory
  }

  mergeWarehouseStock(
    warehouses: InventoryItem[][]
  ): Collection<InventoryItem> {
    return warehouses.reduce(
      (combined, warehouse) => combined.union(warehouse),
      collect<InventoryItem>([])
    )
  }

  consolidateStockLevels(
    primary: Collection<InventoryItem>,
    secondary: InventoryItem[]
  ): Collection<InventoryItem> {
    // Combine and sum quantities for same SKUs
    const combined = primary.union(secondary)
    const quantities = new Map<string, number>()

    combined.each(item => {
      quantities.set(
        item.sku,
        (quantities.get(item.sku) || 0) + item.quantity
      )
    })

    return combined
      .unique('sku')
      .map(item => ({
        ...item,
        quantity: quantities.get(item.sku) || item.quantity
      }))
  }
}

Catalog Consolidator ​

typescript
interface CatalogItem {
  id: string
  name: string
  categories: string[]
  variants: string[]
  price: number
}

class CatalogManager {
  private catalogs: Map<string, Collection<CatalogItem>>

  constructor() {
    this.catalogs = new Map()
  }

  addCatalog(name: string, items: CatalogItem[]): void {
    this.catalogs.set(name, collect(items))
  }

  getMasterCatalog(): Collection<CatalogItem> {
    let masterCatalog = collect<CatalogItem>([])

    this.catalogs.forEach(catalog => {
      masterCatalog = masterCatalog.union(catalog.all())
    })

    return masterCatalog
  }

  getConsolidatedCategories(): string[] {
    return this.getMasterCatalog()
      .flatMap(item => item.categories)
      .unique()
      .all()
  }

  getConsolidatedVariants(): string[] {
    return this.getMasterCatalog()
      .flatMap(item => item.variants)
      .unique()
      .all()
  }
}

Advanced Usage ​

Multi-Store Product Manager ​

typescript
interface StoreProduct {
  id: string
  name: string
  price: number
  store: string
  available: boolean
}

class MultiStoreManager {
  private storeProducts: Map<string, Collection<StoreProduct>>

  constructor() {
    this.storeProducts = new Map()
  }

  addStoreProducts(store: string, products: StoreProduct[]): void {
    this.storeProducts.set(store, collect(products))
  }

  getAvailableProducts(): Collection<StoreProduct> {
    let available = collect<StoreProduct>([])

    this.storeProducts.forEach(products => {
      available = available.union(
        products.filter(p => p.available).all()
      )
    })

    return available
  }

  getPriceRange(): { min: number; max: number } {
    const allProducts = this.getAvailableProducts()
    return {
      min: allProducts.min('price') ?? 0,
      max: allProducts.max('price') ?? 0
    }
  }

  getStoresWithProduct(productId: string): string[] {
    return Array.from(this.storeProducts.entries())
      .filter(([_, products]) =>
        products.some(p => p.id === productId)
      )
      .map(([store]) => store)
  }
}

Type Safety ​

typescript
interface TypedProduct {
  id: number
  name: string
  category: string
}

const collection1 = collect<TypedProduct>([
  { id: 1, name: 'A', category: 'X' },
  { id: 2, name: 'B', category: 'Y' }
])

const collection2: TypedProduct[] = [
  { id: 2, name: 'B', category: 'Y' },
  { id: 3, name: 'C', category: 'Z' }
]

// Type-safe union
const combined = collection1.union(collection2)

// TypeScript enforces type matching
// collection1.union([1, 2, 3])  // ✗ TypeScript error

Return Value ​

  • Returns a new Collection containing unique items from both collections
  • Original collections remain unchanged
  • Maintains type safety with TypeScript
  • Can be chained with other collection methods
  • Uses strict equality (===) for comparison
  • Preserves the original object references

Common Use Cases ​

1. Inventory Management ​

  • Combining warehouse inventories
  • Merging store stocks
  • Consolidating supplier catalogs
  • Unifying product variants
  • Combining storage locations

2. Multi-Channel Operations ​

  • Merging online/offline inventory
  • Combining marketplace listings
  • Consolidating sales channels
  • Unifying product feeds
  • Merging store catalogs

3. Product Management ​

  • Combining product categories
  • Merging product attributes
  • Unifying product variants
  • Consolidating product tags
  • Combining specifications

4. Supplier Integration ​

  • Merging supplier catalogs
  • Combining product lines
  • Unifying pricing lists
  • Consolidating offerings
  • Combining availability data

5. Store Management ​

  • Merging store inventories
  • Combining location data
  • Unifying price lists
  • Consolidating store products
  • Combining store catalogs

6. Category Management ​

  • Merging category trees
  • Combining taxonomies
  • Unifying classifications
  • Consolidating hierarchies
  • Combining department lists

7. Price Management ​

  • Combining price lists
  • Merging discount rules
  • Unifying promotional offers
  • Consolidating pricing tiers
  • Combining special prices

8. Stock Control ​

  • Merging stock levels
  • Combining location data
  • Unifying availability info
  • Consolidating stock alerts
  • Combining reorder points

9. Order Management ​

  • Combining order sources
  • Merging shipping options
  • Unifying payment methods
  • Consolidating fulfillment
  • Combining delivery zones

10. Customer Data ​

  • Merging customer lists
  • Combining preferences
  • Unifying purchase history
  • Consolidating segments
  • Combining behavior data

Released under the MIT License.