Skip to content

count Method

The count() method returns the total number of items in the collection. Among other things, this is useful for inventory counting, cart totals, and general collection size checks.

Basic Syntax

typescript
collect(items).count(): number

Examples

Basic Usage

typescript
import { collect } from 'ts-collect'

const numbers = collect([1, 2, 3, 4, 5])
console.log(numbers.count())  // 5

// After filtering
const evenNumbers = collect([1, 2, 3, 4, 5])
  .filter(n => n % 2 === 0)
console.log(evenNumbers.count())  // 2

// Empty collection
const empty = collect([])
console.log(empty.count())  // 0

Working with Objects

typescript
interface Product {
  id: number
  name: string
  inStock: boolean
  category: string
}

const products = collect<Product>([
  { id: 1, name: 'Widget', inStock: true, category: 'tools' },
  { id: 2, name: 'Gadget', inStock: false, category: 'electronics' },
  { id: 3, name: 'Gizmo', inStock: true, category: 'electronics' }
])

// Count all products
console.log(products.count())  // 3

// Count in-stock products
console.log(products.where('inStock', true).count())  // 2

// Count by category
console.log(products.where('category', 'electronics').count())  // 2

Real-world Examples

Shopping Cart Manager

typescript
interface CartItem {
  id: string
  productId: string
  quantity: number
  price: number
  isDigital: boolean
}

class CartManager {
  constructor(private items: Collection<CartItem>) {}

  getTotalItems(): number {
    return this.items.count()
  }

  getTotalQuantity(): number {
    return this.items.sum('quantity')
  }

  getPhysicalItemCount(): number {
    return this.items
      .filter(item => !item.isDigital)
      .count()
  }

  getShippingBoxesNeeded(): number {
    const physicalItems = this.getPhysicalItemCount()
    return physicalItems === 0 ? 0 : Math.ceil(physicalItems / 5)
  }

  requiresShipping(): boolean {
    return this.getPhysicalItemCount() > 0
  }
}

Inventory Counter

typescript
interface StockItem {
  sku: string
  quantity: number
  reorderPoint: number
  location: string
}

class InventoryCounter {
  constructor(private inventory: Collection<StockItem>) {}

  getTotalProducts(): number {
    return this.inventory.count()
  }

  getLowStockCount(): number {
    return this.inventory
      .filter(item => item.quantity <= item.reorderPoint)
      .count()
  }

  getOutOfStockCount(): number {
    return this.inventory
      .filter(item => item.quantity === 0)
      .count()
  }

  getLocationCounts(): Record<string, number> {
    return this.inventory
      .groupBy('location')
      .map(items => items.count())
      .all()
  }

  generateStockReport(): {
    total: number
    lowStock: number
    outOfStock: number
    locations: Record<string, number>
  } {
    return {
      total: this.getTotalProducts(),
      lowStock: this.getLowStockCount(),
      outOfStock: this.getOutOfStockCount(),
      locations: this.getLocationCounts()
    }
  }
}

Advanced Usage

Order Analytics System

typescript
interface Order {
  id: string
  status: 'pending' | 'processing' | 'completed' | 'cancelled'
  items: number
  total: number
  customerId: string
}

class OrderAnalytics {
  constructor(private orders: Collection<Order>) {}

  getOrderMetrics(): {
    total: number
    pending: number
    processing: number
    completed: number
    cancelled: number
    averageItems: number
  } {
    return {
      total: this.orders.count(),
      pending: this.orders.where('status', 'pending').count(),
      processing: this.orders.where('status', 'processing').count(),
      completed: this.orders.where('status', 'completed').count(),
      cancelled: this.orders.where('status', 'cancelled').count(),
      averageItems: this.orders.avg('items')
    }
  }

  getCustomerOrderCounts(): Map<string, number> {
    return new Map(
      Array.from(
        this.orders
          .groupBy('customerId')
          .map(orders => orders.count())
          .entries()
      )
    )
  }

  getHighVolumeCustomers(threshold: number): string[] {
    return Array.from(this.getCustomerOrderCounts().entries())
      .filter(([_, count]) => count >= threshold)
      .map(([customerId]) => customerId)
  }
}

Type Safety

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

const products = collect<TypedProduct>([
  { id: 1, name: 'A', stock: 100 },
  { id: 2, name: 'B', stock: 0 }
])

// Type-safe counting
const totalProducts: number = products.count()
const inStock: number = products
  .filter(p => p.stock > 0)
  .count()

Return Value

  • Returns a number representing the total items in the collection
  • Always returns a non-negative integer
  • Returns 0 for empty collections
  • Can be used in calculations
  • Represents the current size of the collection
  • Counts after any filters or transformations

Common Use Cases

1. Cart Operations

  • Item counting
  • Quantity totals
  • Shipping calculations
  • Package estimation
  • Item type counting

2. Inventory Management

  • Stock counting
  • Location totals
  • Category quantities
  • Reorder monitoring
  • Availability tracking

3. Order Processing

  • Order counting
  • Status tracking
  • Batch sizing
  • Queue monitoring
  • Fulfillment tracking

4. Product Management

  • Category totals
  • Variant counting
  • Collection sizes
  • Feature counting
  • Attribute totals

5. Customer Analytics

  • Order counting
  • Interaction totals
  • Review counting
  • Rating tallies
  • Preference counting

6. Reporting

  • Total calculations
  • Status summaries
  • Category breakdowns
  • Performance metrics
  • Activity tracking

7. Stock Control

  • Inventory levels
  • Location counts
  • Reorder tracking
  • Availability stats
  • Movement tracking

8. User Management

  • Account totals
  • Role counting
  • Permission tracking
  • Session counting
  • Activity metrics

9. Search Operations

  • Result counting
  • Match totals
  • Filter results
  • Category matches
  • Relevance metrics

10. Validation

  • Minimum quantities
  • Maximum limits
  • Threshold checking
  • Capacity monitoring
  • Quota tracking

Released under the MIT License.