Skip to content

WhereBetween Method ​

The whereBetween() method filters the collection to get items where the given key's value is between the given minimum and maximum values (inclusive).

Basic Syntax ​

typescript
collect(items).whereBetween(key: keyof T, min: T[K], max: T[K]): Collection<T>

Examples ​

Basic Usage ​

typescript
import { collect } from 'ts-collect'

// Filter numbers in range
const numbers = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
const between = numbers.whereBetween('value', 4, 7)
console.log(between.all()) // [4, 5, 6, 7]

// Filter objects by numeric property
const items = collect([
  { id: 1, score: 50 },
  { id: 2, score: 75 },
  { id: 3, score: 90 },
  { id: 4, score: 60 }
])

const midScores = items.whereBetween('score', 60, 80)

Working with Objects ​

typescript
interface Product {
  id: number
  name: string
  price: number
  stock: number
  weight: number
}

const products = collect<Product>([
  { id: 1, name: 'Item 1', price: 100, stock: 5, weight: 1.2 },
  { id: 2, name: 'Item 2', price: 200, stock: 10, weight: 2.5 },
  { id: 3, name: 'Item 3', price: 150, stock: 3, weight: 1.8 },
  { id: 4, name: 'Item 4', price: 300, stock: 8, weight: 3.0 }
])

// Filter by price range
const midPriceProducts = products.whereBetween('price', 150, 250)

// Filter by stock range
const stockRange = products.whereBetween('stock', 5, 10)

Real-world Examples ​

Price Filter ​

typescript
interface PriceRange {
  min: number
  max: number
  label: string
}

class PriceFilter {
  private items: Collection<Product>
  private ranges: PriceRange[]

  constructor(items: Product[]) {
    this.items = collect(items)
    this.ranges = [
      { min: 0, max: 100, label: 'Budget' },
      { min: 101, max: 500, label: 'Mid-Range' },
      { min: 501, max: 1000, label: 'Premium' }
    ]
  }

  getItemsInRange(label: string): Collection<Product> {
    const range = this.ranges.find(r => r.label === label)
    if (!range)
      return collect([])
    return this.items.whereBetween('price', range.min, range.max)
  }

  getCustomRange(min: number, max: number): Collection<Product> {
    return this.items.whereBetween('price', min, max)
  }
}

Date Range Filter ​

typescript
interface Event {
  id: string
  title: string
  date: Date
  attendees: number
}

class EventManager {
  private events: Collection<Event>

  constructor(events: Event[]) {
    this.events = collect(events)
  }

  getEventsInDateRange(startDate: Date, endDate: Date): Collection<Event> {
    return this.events.filter((event) => {
      const timestamp = event.date.getTime()
      return timestamp >= startDate.getTime()
        && timestamp <= endDate.getTime()
    })
  }

  getEventsByAttendees(minAttendees: number, maxAttendees: number): Collection<Event> {
    return this.events.whereBetween('attendees', minAttendees, maxAttendees)
  }
}

Advanced Usage ​

Performance Metrics ​

typescript
interface Metric {
  timestamp: Date
  value: number
  confidence: number
  source: string
}

class MetricsAnalyzer {
  private metrics: Collection<Metric>

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

  getMetricsInRange(min: number, max: number): Collection<Metric> {
    return this.metrics
      .whereBetween('value', min, max)
      .filter(metric => metric.confidence >= 0.8)
  }

  getMetricsByConfidence(minConfidence: number, maxConfidence: number): Collection<Metric> {
    return this.metrics.whereBetween('confidence', minConfidence, maxConfidence)
  }
}

Grade Analysis ​

typescript
interface StudentGrade {
  studentId: string
  course: string
  score: number
  semester: number
}

class GradeAnalyzer {
  private grades: Collection<StudentGrade>
  private readonly gradeRanges = {
    A: { min: 90, max: 100 },
    B: { min: 80, max: 89 },
    C: { min: 70, max: 79 },
    D: { min: 60, max: 69 },
    F: { min: 0, max: 59 }
  }

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

  getGradeRange(grade: keyof typeof this.gradeRanges): Collection<StudentGrade> {
    const range = this.gradeRanges[grade]
    return this.grades.whereBetween('score', range.min, range.max)
  }

  getCustomRange(min: number, max: number): Collection<StudentGrade> {
    return this.grades.whereBetween('score', min, max)
  }
}

Type Safety ​

typescript
interface TypedItem {
  id: number
  value: number
  score: number
  timestamp: Date
}

const items = collect<TypedItem>([
  { id: 1, value: 100, score: 85, timestamp: new Date() },
  { id: 2, value: 150, score: 92, timestamp: new Date() },
  { id: 3, value: 200, score: 78, timestamp: new Date() }
])

// Type-safe range filtering
const valueRange = items.whereBetween('value', 100, 180)
const scoreRange = items.whereBetween('score', 80, 95)

// TypeScript enforces valid keys and comparable values
// items.whereBetween('invalid', 0, 100)           // ✗ TypeScript error
// items.whereBetween('id', 'min', 'max')          // ✗ TypeScript error

Return Value ​

  • Returns a new Collection containing items within the specified range
  • Range is inclusive of min and max values
  • Returns empty collection if no matches found
  • Original collection remains unchanged
  • Maintains type safety with TypeScript
  • Can be chained with other collection methods

Common Use Cases ​

1. Price Filtering ​

  • Price ranges
  • Cost categories
  • Budget filtering
  • Value ranges

2. Date Ranges ​

  • Time periods
  • Date filtering
  • Schedule ranges
  • Timeline segments

3. Numeric Ranges ​

  • Score ranges
  • Value spans
  • Quantity ranges
  • Measurement bounds

4. Grade Systems ​

  • Score ranges
  • Grade boundaries
  • Performance bands
  • Rating ranges

5. Age Groups ​

  • Age ranges
  • Year groups
  • Time spans
  • Period filtering

6. Size Categories ​

  • Dimension ranges
  • Size groups
  • Weight classes
  • Volume spans

7. Performance Metrics ​

  • Score ranges
  • Rating bands
  • Performance levels
  • Metric bounds

8. Stock Levels ​

  • Inventory ranges
  • Quantity spans
  • Stock levels
  • Supply bounds

9. Statistical Ranges ​

  • Value ranges
  • Confidence intervals
  • Distribution bands
  • Probability ranges

10. Resource Usage ​

  • Usage levels
  • Consumption ranges
  • Capacity bounds
  • Utilization spans

Released under the MIT License.