lodash已死?radash最全使用介紹(附源碼說明)—— Array方法篇(3)

来源:https://www.cnblogs.com/muqiqiang/p/18130765
-Advertisement-
Play Games

前言 我們已經介紹了radash的相關信息和部分Array相關方法,詳情可前往主頁查看; 本篇我們繼續介紹radash中Array的相關方法; 下期我們將介紹解析radash中剩餘的 Array相關方法,並整理出Array方法使用目錄,包括文章說明和腦圖說明。 Radash的Array相關方法詳解 ...


前言

  • 我們已經介紹了radash的相關信息和部分Array相關方法,詳情可前往主頁查看;
  • 本篇我們繼續介紹radash中Array的相關方法;
  • 下期我們將介紹解析radash中剩餘的 Array相關方法,並整理出Array方法使用目錄,包括文章說明腦圖說明

Radash的Array相關方法詳解

iterate:把一個函數迭代執行指定次數

  1. 使用說明
    • 參數:迭代次數、每次迭代調用的函數、迭代初始值。
    • 返回值:返回最終一次迴圈迭代的值。
  2. 使用代碼示例
    import { iterate } from 'radash'
    
    const value = iterate(
      4,
      (acc, idx) => {
        return acc + idx
      },
      0
    ) // => 10
    
  3. 源碼解析
    // 定義一個泛型函數 `iterate`,它接收三個參數:
    // `count` 是一個數字,表示迭代的次數;
    // `func` 是一個函數,它在每次迭代中被調用,接收當前值和迭代次數作為參數,並返回一個新的值;
    // `initValue` 是迭代的初始值,它的類型為泛型 `T`。
    export const iterate = <T>(
      count: number,
      func: (currentValue: T, iteration: number) => T,
      initValue: T
    ) => {
      // 初始化一個變數 `value`,用於存儲當前的迭代值,起始值設置為 `initValue`。
      let value = initValue
      // 使用一個 `for` 迴圈進行 `count` 次迭代。迴圈變數 `i` 從 1 開始,以確保迭代次數正確。
      for (let i = 1; i <= count; i++) {
        // 在每次迭代中,調用函數 `func`,傳入當前的 `value` 和迭代次數 `i`,
        // 然後將 `func` 函數返回的新值賦給 `value`,以便在下一次迭代中使用。
        value = func(value, i)
      }
      // 迴圈結束後,返回最終的迭代值 `value`。
      return value
    }
    
    • 方法流程說明:
      1. 接收 countfuncinitValue 作為參數。
      2. 初始化變數 valueinitValue
      3. 進行 count 次迭代,每次迭代中調用 func 函數,傳入當前的 value 和迭代次數 i
      4. func 函數返回一個新值,這個新值成為下一次迭代的 value
      5. 迭代完成後,返回最後一次 func 函數調用的結果。

last:輸出數組的最後一項,如果數組為空則輸出傳入的預設值

  1. 使用說明

    • 參數:目標數組,或者空數組和預設值。
    • 返回值:數組最後一項,如果數組為空則輸出傳入的預設值。
  2. 使用代碼示例

    import { last } from 'radash'
    
    const fish = ['marlin', 'bass', 'trout']
    
    const lastFish = last(fish) // => 'trout'
    const lastItem = last([], 'bass') // => 'bass'
    
  3. 源碼解析

    // 定義一個泛型函數 `last`,它接收一個具有隻讀屬性的泛型數組 `array`,
    // 和一個可選的預設值 `defaultValue`,其類型可以是泛型 `T` 或 `null` 或 `undefined`,預設值為 `undefined`。
    export const last = <T>(
      array: readonly T[],
      defaultValue: T | null | undefined = undefined
    ) => {
      // 如果數組存在且長度大於0,返回數組的最後一個元素。
      // 否則,返回提供的預設值 `defaultValue`。
      return array?.length > 0 ? array[array.length - 1] : defaultValue
    }
    
    • 方法流程說明:
      1. 檢查傳入的數組 array 是否存在且長度大於0。
      2. 如果數組存在且不為空(長度大於0),則返回數組的最後一個元素 array[array.length - 1]
      3. 如果數組不存在或為空,返回 defaultValue
      4. 這個函數對於需要安全地訪問數組最後一個元素而不拋出錯誤的情況很有用,特別是在不確定數組是否為空的情況下。通過提供一個預設值,你可以避免在數組為空時訪問未定義的索引。如果沒有提供預設值,函數將預設返回 undefined

list:創建包含特定項的數組

  1. 使用說明
    • 參數:start、end、值,步長。
    • 返回值:從start開始遍歷到end,輸出一個數組,包含特定項(值)的數組。
  2. 使用代碼示例
    import { list } from 'radash'
    
    list(3)                  // [0, 1, 2, 3]
    list(0, 3)               // [0, 1, 2, 3]
    list(0, 3, 'y')          // [y, y, y, y]
    list(0, 3, () => 'y')    // [y, y, y, y]
    list(0, 3, i => i)       // [0, 1, 2, 3]
    list(0, 3, i => `y${i}`) // [y0, y1, y2, y3]
    list(0, 3, obj)          // [obj, obj, obj, obj]
    list(0, 6, i => i, 2)    // [0, 2, 4, 6]
    
  3. 源碼解析
    // 定義一個泛型函數 `list`,它接受一個預設類型參數 `T`,預設為 `number`。
    // 函數接受四個參數:起始值或長度 `startOrLength`,可選的結束值 `end`,
    // 可選的值或映射函數 `valueOrMapper` 用於生成數組中的值,以及可選的步長 `step`。
    export const list = <T = number>(
      startOrLength: number,
      end?: number,
      valueOrMapper?: T | ((i: number) => T),
      step?: number
    ): T[] => {
      // 使用 `Array.from` 方法來創建一個數組,它接受 `range` 生成器函數作為參數。
      // `range` 函數根據提供的參數生成一個序列的值。
      return Array.from(range(startOrLength, end, valueOrMapper, step))
    }
    
    • 方法流程說明:
      1. 調用 range 函數,傳入 startOrLength(起始值或長度)、end(結束值)、valueOrMapper(值或映射函數)、step(步長)四個參數。這些參數都是可選的,除了 startOrLength 必須提供。
      2. range 函數是一個生成器,根據提供的參數生成一個數字序列。如果指定了 end,那麼 startOrLength 作為起始值,end 作為結束值。如果沒有指定 endstartOrLength 作為序列的長度。valueOrMapper 可以是一個值,此時序列中的每個元素都是這個值;也可以是一個函數,此時序列中的每個元素都是這個函數的返回值。step 指定了序列中每個元素之間的間隔。
      3. Array.from 方法用於從 range 生成器創建一個數組。生成器的每次迭代返回的值都會成為數組中的一個元素。
      4. 最終,list 函數返回這個數組。

max:獲取對象數組中指定標識符最大的項

  1. 使用說明
    • 參數:目標對象數組、指定標識符的回調函數。
    • 返回值:符合條件的對象。
  2. 使用代碼示例
    import { max } from 'radash'
    
    const fish = [
      {
        name: 'Marlin',
        weight: 105,
        source: 'ocean'
      },
      {
        name: 'Bass',
        weight: 8,
        source: 'lake'
      },
      {
        name: 'Trout',
        weight: 13,
        source: 'lake'
      }
    ]
    
    max(fish, f => f.weight) // => {name: "Marlin", weight: 105, source: "ocean"}
    
  3. 源碼解析
    // 定義一個泛型函數 `max`,它接受一個具有隻讀屬性的泛型數組 `array`,
    // 以及一個可選的函數 `getter`,該函數用於從數組元素中提取一個數字用於比較大小。
    export function max<T>(
      array: readonly T[],
      getter?: (item: T) => number
    ): T | null {
      // 如果 `getter` 函數未提供,則使用預設函數,它將元素作為其自己的值。
      const get = getter ?? ((v: any) => v)
      // 調用 `boil` 函數,傳入數組和一個比較函數,
      // 比較函數用 `get` 函數獲取的值來決定哪個元素更大。
      return boil(array, (a, b) => (get(a) > get(b) ? a : b))
    }
    
    // 定義一個泛型函數 `boil`,它接受一個具有隻讀屬性的泛型數組 `array`,
    // 以及一個比較函數 `compareFunc`,該函數用於比較兩個元素並返回其中一個。
    export const boil = <T>(
      array: readonly T[],
      compareFunc: (a: T, b: T) => T
    ) => {
      // 如果傳入的數組不存在,或者其長度為0,則返回 null。
      if (!array || (array.length ?? 0) === 0) return null
      // 使用數組的 `reduce` 方法應用 `compareFunc`,將數組歸約為單一的值。
      return array.reduce(compareFunc)
    }
    
    • 方法流程說明:
      1. 接收一個數組 array 和一個可選的 getter 函數。如果 getter 函數提供,它將用於從每個元素中提取用於比較的數字值。
      2. 如果沒有提供 getter 函數,使用一個預設的函數,這個函數簡單地返回元素本身作為比較值。
      3. 調用 boil 函數,傳入數組和一個比較函數。這個比較函數使用 get 函數從兩個元素 ab 中提取值,並返回較大值對應的元素。
      4. boil 函數通過 reduce 方法遍曆數組,應用比較函數,並最終返回單一的元素,即數組中的最大元素。如果數組為空或未定義,boil 函數返回 null
      5. max 函數最終返回 boil 函數的結果,即數組中的最大元素,如果數組為空,則返回 null

merge:合併數組中符合條件的項,並且會覆蓋第一個數組

  1. 使用說明

    • 參數:數組1、數組2、條件函數。
    • 返回值:合併覆蓋後的數組。
  2. 使用代碼示例

    import { merge } from 'radash'
    
    const gods = [
      {
        name: 'Zeus',
        power: 92
      },
      {
        name: 'Ra',
        power: 97
      }
    ]
    
    const newGods = [
      {
        name: 'Zeus',
        power: 100
      }
    ]
    
    merge(gods, newGods, f => f.name) // => [{name: "Zeus" power: 100}, {name: "Ra", power: 97}]
    
  3. 源碼解析

    export const merge = <T>(
      root: readonly T[],
      others: readonly T[],
      matcher: (item: T) => any
    ) => {
      if (!others && !root) return []
      if (!others) return root
      if (!root) return []
      if (!matcher) return root
      return root.reduce((acc, r) => {
        const matched = others.find(o => matcher(r) === matcher(o))
        if (matched) acc.push(matched)
        else acc.push(r)
        return acc
      }, [] as T[])
    }
    
    • 方法流程說明:
      1. 進行一系列的檢查,如果 othersroot 兩個數組都不存在或為空,或者沒有提供 matcher 函數,就返回 root 或者一個空數組。
      2. 使用 root 數組的 reduce 方法構建最終的合併數組。在每次迭代中,使用 matcher 函數檢查 root 數組中的當前元素是否在 others 數組中有匹配的元素。
      3. 如果在 others 數組中找到了一個匹配的元素,就把這個匹配的元素添加到累加器數組 acc 中。
      4. 如果沒有找到匹配的元素,就把 root 數組中的當前元素添加到累加器 acc 中。
      5. 繼續處理 root 數組的下一個元素,直到所有元素都被處理完畢。
      6. 返回累加器 acc,它現在包含了合併後的元素。

min:獲取對象數組中指定標識符最小的項

  1. 使用說明
    • 參數:目標對象數組、指定標識符的條件函數。
    • 返回值:符合條件的的項
  2. 使用代碼示例
    import { min } from 'radash'
    
    const fish = [
      {
        name: 'Marlin',
        weight: 105,
        source: 'ocean'
      },
      {
        name: 'Bass',
        weight: 8,
        source: 'lake'
      },
      {
        name: 'Trout',
        weight: 13,
        source: 'lake'
      }
    ]
    
    min(fish, f => f.weight) // => {name: "Bass", weight: 8, source: "lake"}
    
  3. 源碼解析
    // 這是 `min` 函數的第一種聲明,它要求傳遞一個 `getter` 函數。
    export function min<T>(
      array: readonly T[],
      getter: (item: T) => number
    ): T | null
    
    // 這是 `min` 函數的第二種聲明,它允許 `getter` 函數是可選的。
    export function min<T>(
      array: readonly T[],
      getter?: (item: T) => number
    ): T | null {
      // 如果沒有提供 `getter` 函數,使用預設函數,它將元素作為其自己的值。
      const get = getter ?? ((v: any) => v)
      // 調用 `boil` 函數,傳入數組和一個比較函數,
      // 比較函數用 `get` 函數獲取的值來決定哪個元素更小。
      return boil(array, (a, b) => (get(a) < get(b) ? a : b))
    }
    
    • 方法流程說明:
      1. 函數接收一個數組 array 和一個可選的 getter 函數。如果提供了 getter 函數,它將用於從每個元素中提取用於比較的數字值。
      2. 如果沒有提供 getter 函數,則使用一個預設的函數,這個函數簡單地返回元素本身作為比較值。
      3. 調用 boil 函數,傳入數組和一個比較函數。這個比較函數使用 get 函數從兩個元素 ab 中提取值,並返回較小值對應的元素。
      4. boil 函數通過 reduce 方法遍曆數組,應用比較函數,並最終返回單一的元素,即數組中的最小元素。如果數組為空或未定義,boil 函數返回 null
      5. min 函數最終返回 boil 函數的結果,即數組中的最小元素,如果數組為空,則返回 null

objectify:根據函數映射的鍵與值把數組轉換為字典對象

  1. 使用說明
    • 參數:目標對象數組、條件函數1用於提取鍵、[條件函數2用於提取值]
    • 返回值:字典對象
  2. 使用代碼示例
    import { objectify } from 'radash'
    
    const fish = [
      {
        name: 'Marlin',
        weight: 105
      },
      {
        name: 'Bass',
        weight: 8
      },
      {
        name: 'Trout',
        weight: 13
      }
    ]
    
    objectify(fish, f => f.name) // => { Marlin: [marlin object], Bass: [bass object], ... }
    objectify(
      fish,
      f => f.name,
      f => f.weight
    ) // => { Marlin: 105, Bass: 8, Trout: 13 }
    
  3. 源碼解析
    // 定義一個泛型函數 `objectify`,它接受三個參數:
    // `array` 是一個具有隻讀屬性的泛型數組,
    // `getKey` 是一個函數,用於從數組元素中提取鍵,
    // `getValue` 是一個可選的函數,用於從數組元素中提取值,預設情況下,它會返回元素本身作為值。
    export const objectify = <T, Key extends string | number | symbol, Value = T>(
      array: readonly T[],
      getKey: (item: T) => Key,
      getValue: (item: T) => Value = item => item as unknown as Value
    ): Record<Key, Value> => {
      // 使用數組的 `reduce` 方法來累積一個對象,該對象將數組元素映射為鍵值對。
      return array.reduce((acc, item) => {
        // 使用 `getKey` 函數從當前元素 `item` 中提取鍵,並使用 `getValue` 函數提取值。
        // 將這個鍵值對添加到累加器對象 `acc` 中。
        acc[getKey(item)] = getValue(item)
        // 返回更新後的累加器 `acc`。
        return acc
      }, {} as Record<Key, Value>) // 初始化累加器 `acc` 為一個空對象。
    }
    
    • 方法流程說明:
      1. 函數接收一個數組 array,一個 getKey 函數用於提取每個元素的鍵,以及一個可選的 getValue 函數用於提取每個元素的值。
      2. 如果沒有提供 getValue 函數,則使用一個預設的函數,這個函數簡單地將元素本身作為值。
      3. 使用 reduce 方法遍曆數組。reduce 方法的累加器 acc 是一個對象,用於存儲鍵值對。
      4. 對於數組中的每個元素 item,使用 getKey 函數提取鍵,並使用 getValue 函數提取值。
      5. 將提取的鍵和值作為一個鍵值對添加到累加器對象 acc 中。
      6. 繼續處理數組的下一個元素,直到所有元素都被處理完畢。
      7. 返回累加器 acc,它現在是一個完整的對象,包含了從數組元素映射而來的鍵值對。

range:根據步長生成一個數值範圍內的迭代值

  1. 使用說明
    • 參數:起始值、[結束值]、[迭代函數]、步長。
    • 返回值:用在for迴圈中迴圈輸出處理的結果值。
  2. 使用代碼示例
    import { range } from 'radash'
    
    range(3)                  // yields 0, 1, 2, 3
    range(0, 3)               // yields 0, 1, 2, 3
    range(0, 3, 'y')          // yields y, y, y, y
    range(0, 3, () => 'y')    // yields y, y, y, y
    range(0, 3, i => i)       // yields 0, 1, 2, 3
    range(0, 3, i => `y${i}`) // yields y0, y1, y2, y3
    range(0, 3, obj)          // yields obj, obj, obj, obj
    range(0, 6, i => i, 2)    // yields 0, 2, 4, 6
    
    for (const i of range(0, 200, 10)) {
      console.log(i) // => 0, 10, 20, 30 ... 190, 200
    }
    
    for (const i of range(0, 5)) {
      console.log(i) // => 0, 1, 2, 3, 4, 5
    }
    
  3. 源碼解析
    // 定義一個泛型生成器函數 `range`,它接受一個預設類型參數 `T`,預設為 `number`。
    // 函數接受四個參數:起始值或長度 `startOrLength`,可選的結束值 `end`,
    // 可選的值或映射函數 `valueOrMapper` 用於生成序列中的值,以及可選的步長 `step`,預設為 1。
    export function* range<T = number>(
      startOrLength: number,
      end?: number,
      valueOrMapper: T | ((i: number) => T) = i => i as T,
      step: number = 1
    ): Generator<T> {
      // 確定 `valueOrMapper` 是一個函數還是一個固定值。如果是函數,則直接使用;如果不是,則創建一個總是返回該值的函數。
      const mapper = isFunction(valueOrMapper) ? valueOrMapper : () => valueOrMapper
      // 如果提供了 `end` 值,則 `start` 為 `startOrLength`;如果沒有提供 `end` 值,則 `start` 預設為 0。
      const start = end ? startOrLength : 0
      // `final` 是序列的結束值,如果提供了 `end` 值,則使用它;如果沒有,則 `final` 為 `startOrLength`。
      const final = end ?? startOrLength
      // 從 `start` 開始,到 `final` 結束,每次迭代增加 `step`。
      for (let i = start; i <= final; i += step) {
        // 使用 `yield` 關鍵字產生由 `mapper` 函數處理的當前迭代值 `i`。
        yield mapper(i)
        // 如果下一次增加步長後的值會超過 `final`,則提前終止迴圈。
        if (i + step > final) break
      }
    }
    
    • 方法流程說明:
      1. 確定 valueOrMapper 參數是一個函數還是一個值。如果是函數,直接用作映射器;如果是值,創建一個總是返回該值的函數作為映射器。
      2. 確定起始值 start。如果提供了 end 參數,startstartOrLength;否則 start 預設為 0。
      3. 確定結束值 final。如果提供了 end 參數,finalend;否則 finalstartOrLength
      4. 使用一個 for 迴圈從 start 遍歷到 final,每次迭代增加步長 step
      5. 在每次迭代中,使用 yield 關鍵字來產出 mapper 函數處理過的當前值。
      6. 如果在下一次迭代步長加上當前值 i 會超過 final,則提前退出迴圈。
      7. 提示:這個 range 函數提供了類似於 Python 中的 range 函數的功能,允許在迭代中產生一系列的值。通過使用生成器,我們可以惰性地產生這些值,這意味著直到迭代器被消費時,這些值才會被計算和產生。這在處理大範圍的值時非常有用,因為它不需要一次性將所有值載入到記憶體中。

replaceOrAppend:替換對象數組中的項或是追加項(條件函數不滿足時追加);

  1. 使用說明

    • 參數:被替換數組、用來的替換的數組、條件函數。
    • 返回值:替換或者追加後的數組。
  2. 使用代碼示例

    import { replaceOrAppend } from 'radash'
    
    const fish = [
      {
        name: 'Marlin',
        weight: 105
      },
      {
        name: 'Salmon',
        weight: 19
      },
      {
        name: 'Trout',
        weight: 13
      }
    ]
    
    const salmon = {
      name: 'Salmon',
      weight: 22
    }
    
    const sockeye = {
      name: 'Sockeye',
      weight: 8
    }
    
    replaceOrAppend(fish, salmon, f => f.name === 'Salmon') // => [marlin, salmon (weight:22), trout]
    replaceOrAppend(fish, sockeye, f => f.name === 'Sockeye') // => [marlin, salmon, trout, sockeye]
    
  3. 源碼解析

    // 定義一個泛型函數 `replaceOrAppend`,它接受三個參數:
    // `list` 是一個具有隻讀屬性的泛型數組,
    // `newItem` 是一個新的元素,將被添加到數組中,
    // `match` 是一個函數,用於確定新元素應該替換數組中的哪個現有元素。
    export const replaceOrAppend = <T>(
      list: readonly T[],
      newItem: T,
      match: (a: T, idx: number) => boolean
    ) => {
      // 如果 `list` 和 `newItem` 都不存在或為空,則返回一個空數組。
      if (!list && !newItem) return []
      // 如果 `newItem` 不存在或為空,則返回 `list` 數組的副本。
      if (!newItem) return [...list]
      // 如果 `list` 不存在或為空,則返回一個只包含 `newItem` 的數組。
      if (!list) return [newItem]
      // 遍歷 `list` 數組,尋找一個匹配的元素。
      for (let idx = 0; idx < list.length; idx++) {
        const item = list[idx]
        // 如果 `match` 函數返回 `true`,則在該位置替換元素。
        if (match(item, idx)) {
          // 創建一個新數組,其中包含從 `list` 開始到匹配位置之前的所有元素,
          // 然後是 `newItem`,然後是從匹配位置之後到 `list` 結束的所有元素。
          return [
            ...list.slice(0, idx),
            newItem,
            ...list.slice(idx + 1, list.length)
          ]
        }
      }
      // 如果沒有找到匹配的元素,將 `newItem` 追加到 `list` 數組的末尾。
      return [...list, newItem]
    }
    
    • 方法流程說明:
      1. 進行一系列的檢查,如果 listnewItem 都不存在或為空,或者只有 newItem 不存在或為空,或者只有 list 不存在或為空,則返回相應的結果。
      2. 如果 listnewItem 都存在,遍歷 list 數組,對於每個元素和它的索引,調用 match 函數。
      3. 如果 match 函數對某個元素返回 true,說明找到了應該被替換的元素。函數將創建一個新數組,該數組由以下部分組成:從 list 的開始到匹配元素之前的部分,newItem,以及從匹配元素之後到 list 結尾的部分。
      4. 如果遍歷完成後沒有找到任何匹配的元素,函數將 newItem 添加到 list 的末尾,並返回新數組。

下期我們將介紹 radash 中剩餘的數組相關方法

  • replace :查找指定項,並用傳入的去替換;
  • select :對數組同時進行過濾和映射,輸出映射後的value數組;
  • shift :把目標數組向右移動 n 個位置返回為一個新數組;
  • sift:過濾調列表中值為false的項,返回剩餘為true的項組成的數組;
  • sort :把數組按照條件函數指定的項的數值大小排序,支持升序和降序;
  • sum:數組對象根據條件函數指定想的數組求和;
  • toggle:查找數組中是否有我們給定的項,有則刪除,沒有則添加;
  • unique:數組去重,去除數組中重覆的項;
  • zipToObject:將第一個數組中的鍵映射到第二個數組中對應的值;
  • zip:把兩個數組變為二維數組,二維數組中的每個數組包含兩個項分別為兩個傳入數組的相同位置的項。

寫在後面

  • 後續作者會整理一份radash完整方法目錄上傳,方便沒法訪問外網的朋友查看使用。
  • 下期方法分享完後,會同步整理分享Array方法的使用說明目錄,方便大家查閱對照使用。
  • 小tips:不出意外的話博主每周五會定時更新,出意外的話就是出意外了。
  • 大家有任何問題或見解,歡迎評論區留言交流和批評指正!!!
  • 點擊訪問:radash官網

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目錄一、關閉MySQL服務1、win+R打開運行,輸入services.msc回車2、服務里找到MySQL並停止二、卸載MySQL軟體1、打開控制模板--卸載程式--卸載MySQL相關的所有組件三、刪除MySQL在物理硬碟上的所有文件1、刪除MySQL的安裝目錄(預設在C盤下的Program Fil ...
  • 原創力作flutter3+getX+window_manager仿Mac桌面系統平臺Flutter-MacOS。 flutter3_macui基於最新跨端技術flutter3.19+dart3.3+window_manager+system_tray構建的一款桌面端仿MacOS風格os系統項目。支持 ...
  • 一、路由導航 路由導航是指在應用程式中通過路徑導航定位到特定頁面的過程。路由導航的實現通常採用路由器(router)來進行管理,路由器根據路徑的不同值將用戶請求導向到不同的頁面。 在HarmonyOS中路由導航主要有:頁面跳轉、頁面返回和頁面返回前增加一個詢問框 1.編程路由 1.1 頁 ...
  • 一、Menu組件 Menu組件是一種常見的用戶界面(UI)控制項,用於在移動應用程式中顯示可選項列表。它通常由一系列鏈接或按鈕組成,以幫助用戶導航和選擇所需的操作。Menu組件可以在水平或垂直方向上呈現,可以是下拉或彈出式的,並可以在需要時動態更新其內容。通常,Menu組件可以在導航欄、側邊欄或上 ...
  • 描述 我們在使用 node 的 npm 下載依賴的時候,往往下載速度很慢,那是因為 npm 預設的是 npm 處於國外的官方鏡像源。所以需要切換到國內的鏡像源來加速依賴下載。所以本文推薦一款簡單好用 npm 鏡像源管理器,可以方便開發者管理自己的鏡像源。 推薦:npm-registry-nrs ...
  • vscode插件liveserver增加對thymeleaf模板的簡單支持 背景 vscode+liveserver開發時,多個頁面引用的公用靜態資源在每個頁面都寫一個遍比較麻煩,想讓liveserver支持簡單的thymeleaf語法,只要能把公用資源抽出來單獨放到一個文件中聲明即可。 網上找了一 ...
  • Scriptable 腳本合集 iOS桌面組件神器(Scriptable)原創腳本,精美作品收集、分享! 如果喜歡,歡迎點個 ⭐️ Star ⭐️ 給予小支持,感謝您的使用!喜歡這個項目?有好的腳本?請考慮留言來幫助完善它! 如果您使用過程中發現有問題或可以改進的流程,請提出 Issue 或 Pul ...
  • JS解混淆 最近在整理之前和一些同伴的分享資料,發現時間已經過了好久,特此整理一些有價值的分享記錄。 JS混淆 學習js混淆可以逆向分析混淆和加密過程,實戰可用於爬蟲和滲透信息獲取 本文檔用於初步介紹js混淆的基礎概念以及如何解混淆、調試,便於幹掉反爬蟲和滲透信息收集思路拓展 概念解釋 混淆/加密 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...