Skip to content

isArray

檢查值是否為數組類型。

語法

typescript
isArray(value: any): value is any[]

參數

  • value (any): 要檢查的值

返回值

  • value is any[]: 類型謂詞,如果值為數組則返回 true

示例

基本用法

typescript
import { isArray } from 'radash'

isArray([1, 2, 3]) // true
isArray([]) // true
isArray('hello') // false
isArray(123) // false
isArray({}) // false
isArray(null) // false
isArray(undefined) // false

類型安全

typescript
import { isArray } from 'radash'

const value: unknown = [1, 2, 3]

if (isArray(value)) {
  // TypeScript 現在知道 value 是數組
  value.push(4) // 類型安全
  console.log(value.length) // 可以訪問數組屬性
}

處理不同類型的值

typescript
import { isArray } from 'radash'

// 數組
isArray([1, 2, 3]) // true
isArray(['a', 'b', 'c']) // true
isArray([{ id: 1 }, { id: 2 }]) // true
isArray([]) // true

// 非數組
isArray('string') // false
isArray(42) // false
isArray(true) // false
isArray(false) // false
isArray(null) // false
isArray(undefined) // false
isArray({}) // false
isArray(() => {}) // false

處理類數組對象

typescript
import { isArray } from 'radash'

// 類數組對象
isArray({ length: 3, 0: 'a', 1: 'b', 2: 'c' }) // false
isArray(document.querySelectorAll('div')) // false
isArray(new Set([1, 2, 3])) // false
isArray(new Map([['a', 1], ['b', 2]])) // false

// 真正的數組
isArray([1, 2, 3]) // true
isArray(Array.from({ length: 3 })) // true
isArray(new Array(3)) // true

處理嵌套數組

typescript
import { isArray } from 'radash'

isArray([[1, 2], [3, 4]]) // true
isArray([[[1]], [[2]]]) // true
isArray([[], []]) // true
isArray([{ items: [1, 2, 3] }]) // true

處理空值

typescript
import { isArray } from 'radash'

isArray(null) // false
isArray(undefined) // false
isArray('') // false
isArray(0) // false
isArray(false) // false
isArray(NaN) // false

處理函數參數

typescript
import { isArray } from 'radash'

function processData(data: unknown) {
  if (isArray(data)) {
    // 處理數組
    return data.map(item => item.toString())
  } else {
    // 處理非數組
    return [data?.toString() || '']
  }
}

processData([1, 2, 3]) // ['1', '2', '3']
processData('hello') // ['hello']
processData(null) // ['']

處理API響應

typescript
import { isArray } from 'radash'

async function fetchUsers() {
  const response = await fetch('/api/users')
  const data = await response.json()
  
  if (isArray(data)) {
    return data.map(user => ({
      id: user.id,
      name: user.name
    }))
  } else {
    throw new Error('Expected array of users')
  }
}

處理表單數據

typescript
import { isArray } from 'radash'

function validateFormData(data: unknown) {
  if (!isArray(data)) {
    throw new Error('Form data must be an array')
  }
  
  return data.filter(item => 
    item && typeof item === 'object' && 'name' in item
  )
}

const formData = [
  { name: 'firstName', value: 'Alice' },
  { name: 'lastName', value: 'Smith' }
]

const validData = validateFormData(formData)
// [{ name: 'firstName', value: 'Alice' }, { name: 'lastName', value: 'Smith' }]

處理配置對象

typescript
import { isArray } from 'radash'

interface Config {
  features?: unknown
  users?: unknown
}

function processConfig(config: Config) {
  const features = isArray(config.features) ? config.features : []
  const users = isArray(config.users) ? config.users : []
  
  return {
    features: features.map(f => f.toString()),
    users: users.map(u => ({ ...u, id: u.id || Date.now() }))
  }
}

const config = {
  features: ['search', 'filter'],
  users: [{ name: 'Alice' }, { name: 'Bob' }]
}

const processed = processConfig(config)
// { features: ['search', 'filter'], users: [{ name: 'Alice', id: 1234567890 }, { name: 'Bob', id: 1234567891 }] }

處理遞歸檢查

typescript
import { isArray } from 'radash'

function flattenArray(arr: unknown[]): unknown[] {
  const result: unknown[] = []
  
  for (const item of arr) {
    if (isArray(item)) {
      result.push(...flattenArray(item))
    } else {
      result.push(item)
    }
  }
  
  return result
}

const nested = [1, [2, 3], [4, [5, 6]]]
const flattened = flattenArray(nested)
// [1, 2, 3, 4, 5, 6]

處理類型守衛

typescript
import { isArray } from 'radash'

function isStringArray(value: unknown): value is string[] {
  return isArray(value) && value.every(item => typeof item === 'string')
}

function isNumberArray(value: unknown): value is number[] {
  return isArray(value) && value.every(item => typeof item === 'number')
}

const stringArray = ['a', 'b', 'c']
const numberArray = [1, 2, 3]
const mixedArray = [1, 'a', true]

isStringArray(stringArray) // true
isNumberArray(numberArray) // true
isStringArray(numberArray) // false
isNumberArray(mixedArray) // false

注意事項

  1. 類型安全: 提供 TypeScript 類型謂詞
  2. 性能: 比 instanceof Array 更可靠
  3. 跨域: 在不同 iframe 間也能正確工作
  4. 空值: 正確處理 null 和 undefined

與其他函數的區別

  • isArray: 檢查是否為數組
  • Array.isArray: 原生方法,功能相同
  • instanceof Array: 可能在不同 iframe 間失效
  • typeof: 無法區分數組和對象

性能

  • 時間復雜度: O(1)
  • 空間復雜度: O(1)
  • 適用場景: 類型檢查、數據驗證

Released under the MIT License.