Skip to content

DiffAssoc Method

The diffAssoc() method compares the collection against another array or collection based on both its keys and values. This method returns the items in the original collection that are not present in the given collection.

Basic Syntax

typescript
collect(items).diffAssoc(array)

Examples

Basic Usage

typescript
import { collect } from 'ts-collect'

const collection = collect({
  color: 'blue',
  size: 'medium',
  price: 100
})

const comparison = {
  color: 'blue',
  size: 'large',
  discount: 10
}

const diff = collection.diffAssoc(comparison)
console.log(diff.all())
// {
//   size: 'medium',
//   price: 100
// }

Working with Arrays

typescript
const original = collect({
  a: 1,
  b: 2,
  c: 3
})

const compare = {
  a: 1,
  b: 4,
  d: 5
}

const diff = original.diffAssoc(compare)
console.log(diff.all())
// {
//   b: 2,
//   c: 3
// }

Real-world Examples

Configuration Comparison

typescript
interface Config {
  [key: string]: string | number | boolean
}

const defaultConfig: Config = {
  debug: true,
  apiUrl: 'https://api.example.com',
  timeout: 5000,
  retries: 3,
  caching: true
}

const userConfig: Config = {
  debug: false,
  apiUrl: 'https://api.example.com',
  timeout: 3000,
  caching: true
}

const configDiff = collect(defaultConfig).diffAssoc(userConfig)
console.log(configDiff.all())
// {
//   debug: true,
//   timeout: 5000,
//   retries: 3
// }

Form Change Detection

typescript
interface FormData {
  [key: string]: string | number | boolean
}

const originalForm: FormData = {
  name: 'John Doe',
  email: 'john@example.com',
  age: 30,
  newsletter: true
}

const updatedForm: FormData = {
  name: 'John Doe',
  email: 'john.doe@example.com',
  age: 31,
  newsletter: true
}

const changes = collect(updatedForm).diffAssoc(originalForm)
console.log(changes.all())
// {
//   email: 'john.doe@example.com',
//   age: 31
// }

Advanced Usage

User Settings Comparison

typescript
interface UserSettings {
  theme: string
  notifications: boolean
  language: string
  fontSize: number
  [key: string]: any
}

const oldSettings: UserSettings = {
  theme: 'dark',
  notifications: true,
  language: 'en',
  fontSize: 14,
  sidebar: 'left'
}

const newSettings: UserSettings = {
  theme: 'light',
  notifications: true,
  language: 'en',
  fontSize: 16,
  autoSave: true
}

const settingsDiff = collect(newSettings).diffAssoc(oldSettings)
console.log(settingsDiff.all())
// {
//   theme: 'light',
//   fontSize: 16,
//   autoSave: true
// }

API Response Comparison

typescript
interface ApiResponse {
  status: string
  code: number
  data: {
    [key: string]: any
  }
}

const previousResponse: ApiResponse = {
  status: 'success',
  code: 200,
  data: {
    userId: 123,
    lastLogin: '2024-01-01',
    permissions: ['read', 'write']
  }
}

const currentResponse: ApiResponse = {
  status: 'success',
  code: 200,
  data: {
    userId: 123,
    lastLogin: '2024-01-02',
    permissions: ['read']
  }
}

const responseDiff = collect(currentResponse.data)
  .diffAssoc(previousResponse.data)

console.log(responseDiff.all())
// {
//   lastLogin: '2024-01-02',
//   permissions: ['read']
// }

Working with Nested Objects

typescript
interface NestedConfig {
  [key: string]: any
}

const originalConfig: NestedConfig = {
  database: {
    host: 'localhost',
    port: 3306,
    credentials: {
      user: 'admin',
      password: 'secret'
    }
  },
  cache: {
    enabled: true,
    ttl: 3600
  }
}

const newConfig: NestedConfig = {
  database: {
    host: 'localhost',
    port: 5432,
    credentials: {
      user: 'admin',
      password: 'newSecret'
    }
  },
  cache: {
    enabled: true,
    ttl: 7200
  }
}

// Compare top-level differences
const configDiff = collect(newConfig).diffAssoc(originalConfig)

// Compare specific nested objects
const dbDiff = collect(newConfig.database).diffAssoc(originalConfig.database)
const cacheDiff = collect(newConfig.cache).diffAssoc(originalConfig.cache)

console.log('Database differences:', dbDiff.all())
// {
//   port: 5432,
//   credentials: {
//     password: 'newSecret'
//   }
// }

Type Safety

typescript
interface TypedObject {
  id: number
  name: string
  value: any
}

const obj1: TypedObject = {
  id: 1,
  name: 'First',
  value: 'test'
}

const obj2: TypedObject = {
  id: 1,
  name: 'Second',
  value: 'test'
}

// TypeScript ensures type safety
const typedDiff = collect(obj1).diffAssoc(obj2)

Return Value

Returns a new Collection instance containing the key/value pairs that exist in the original collection but not in the given comparison array/collection.

Released under the MIT License.