Skip to content

Median Method

The median() method returns the median value of the collection. When given a key, it returns the median of the values of that key across all objects in the collection.

Basic Syntax

typescript
// Median of array values
collect(items).median(): number | undefined

// Median of object property values
collect(items).median(key: keyof T): number | undefined

Examples

Basic Usage

typescript
import { collect } from 'ts-collect'

// Simple array median
const numbers = collect([1, 5, 2, 8, 3])
console.log(numbers.median()) // 3

// Median with objects
const scores = collect([
  { value: 85 },
  { value: 90 },
  { value: 95 },
  { value: 82 },
  { value: 88 }
])
console.log(scores.median('value')) // 88

Working with Objects

typescript
interface SalesRecord {
  id: number
  amount: number
  region: string
  quarter: number
}

const sales = collect<SalesRecord>([
  { id: 1, amount: 1000, region: 'North', quarter: 1 },
  { id: 2, amount: 1500, region: 'South', quarter: 1 },
  { id: 3, amount: 750, region: 'East', quarter: 1 },
  { id: 4, amount: 2000, region: 'West', quarter: 1 },
  { id: 5, amount: 1250, region: 'Central', quarter: 1 }
])

// Find median sale amount
const medianAmount = sales.median('amount') // 1250

Real-world Examples

Price Analysis

typescript
interface PropertyListing {
  id: string
  price: number
  sqft: number
  bedrooms: number
  location: string
}

class PropertyAnalyzer {
  private listings: Collection<PropertyListing>

  constructor(listings: PropertyListing[]) {
    this.listings = collect(listings)
  }

  getMedianPrice(): number | undefined {
    return this.listings.median('price')
  }

  getMedianPricePerSqft(): number | undefined {
    return this.listings
      .map(listing => listing.price / listing.sqft)
      .median()
  }

  getMedianByBedrooms(bedrooms: number): number | undefined {
    return this.listings
      .filter(listing => listing.bedrooms === bedrooms)
      .median('price')
  }
}

Performance Metrics

typescript
interface PerformanceMetric {
  timestamp: Date
  responseTime: number
  errorRate: number
  throughput: number
}

class PerformanceAnalyzer {
  private metrics: Collection<PerformanceMetric>

  constructor(metrics: PerformanceMetric[]) {
    this.metrics = collect(metrics)
  }

  getMedianResponseTime(): number | undefined {
    return this.metrics.median('responseTime')
  }

  getMedianErrorRate(): number | undefined {
    return this.metrics.median('errorRate')
  }

  getHourlyMedian(hour: number): number | undefined {
    return this.metrics
      .filter(metric => metric.timestamp.getHours() === hour)
      .median('responseTime')
  }
}

Advanced Usage

Statistical Analysis

typescript
interface DataPoint {
  value: number
  confidence: number
  category: string
  timestamp: Date
}

class StatisticalAnalyzer {
  private data: Collection<DataPoint>

  constructor(data: DataPoint[]) {
    this.data = collect(data)
  }

  getMedianByCategory(category: string): number | undefined {
    return this.data
      .filter(point => point.category === category)
      .median('value')
  }

  getConfidenceWeightedMedian(): number | undefined {
    return this.data
      .map(point => point.value * point.confidence)
      .median()
  }

  getTimeWindowMedian(startTime: Date, endTime: Date): number | undefined {
    return this.data
      .filter(point =>
        point.timestamp >= startTime
        && point.timestamp <= endTime
      )
      .median('value')
  }
}

Student Grade Analysis

typescript
interface Grade {
  studentId: string
  subject: string
  score: number
  term: string
  weight: number
}

class GradeAnalyzer {
  private grades: Collection<Grade>

  constructor(grades: Grade[]) {
    this.grades = collect(grades)
  }

  getMedianBySubject(subject: string): number | undefined {
    return this.grades
      .filter(grade => grade.subject === subject)
      .median('score')
  }

  getWeightedMedian(): number | undefined {
    return this.grades
      .map(grade => grade.score * grade.weight)
      .median()
  }

  getTermMedian(term: string): number | undefined {
    return this.grades
      .filter(grade => grade.term === term)
      .median('score')
  }
}

Type Safety

typescript
interface TypedItem {
  id: number
  value: number
  optional?: number
}

const items = collect<TypedItem>([
  { id: 1, value: 100 },
  { id: 2, value: 200, optional: 50 },
  { id: 3, value: 300 }
])

// Type-safe property access
const medianValue = items.median('value') // ✓ Valid
const medianOptional = items.median('optional') // ✓ Valid
// items.median('nonexistent')                  // ✗ TypeScript error

Return Value

  • Returns the median value of the collection
  • Returns undefined for empty collections
  • For even number of items, returns average of two middle values
  • For objects, returns median of specified property values
  • Maintains type safety with TypeScript
  • Handles undefined/null values appropriately

Common Use Cases

1. Statistical Analysis

  • Finding central tendency
  • Analyzing distributions
  • Processing datasets
  • Outlier detection

2. Price Analysis

  • Market pricing
  • Cost analysis
  • Value assessment
  • Price trends

3. Performance Metrics

  • Response times
  • Load analysis
  • System metrics
  • Resource usage

4. Academic Scoring

  • Grade analysis
  • Score distributions
  • Performance assessment
  • Student evaluation

5. Financial Analysis

  • Transaction values
  • Asset pricing
  • Market analysis
  • Cost assessment

6. Time Series Analysis

  • Duration analysis
  • Response patterns
  • Time distributions
  • Process timing

7. Quality Control

  • Measurement analysis
  • Process control
  • Deviation assessment
  • Quality metrics

8. Load Balancing

  • Resource distribution
  • Usage patterns
  • Capacity analysis
  • Workload assessment

9. Demographic Analysis

  • Population metrics
  • Distribution analysis
  • Trend assessment
  • Pattern recognition

10. Sensor Data

  • Measurement analysis
  • Reading distributions
  • Signal processing
  • Data normalization

Released under the MIT License.