Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | 1x 1x 1x 1x 1x 1x 5x 5x 1x 1x 1x 1x 1x 1x 1x 1x 4x 4x 1x 1x 1x 1x 1x 1x 1x 3x 2x 1x 1x 1x 1x 1x 1x 2x 1x 1x 1x 1x 2x 1x 1x 1x 1x 1x 1x 2x 2x 1x 1x 1x 1x 1x 1x 1x 1x 5x 5x 9x 9x 8x 8x 2x 2x 9x 1x 1x 9x 4x 5x 1x 1x 1x 1x 1x 1x 1x 1x 4x 4x 1x 1x 1x 1x 1x 1x | import clonedeep from 'lodash.clonedeep'
/**
 * @description 'For simple data, you use it is better.(Object who not includes object type data)'
 * @param target
 */
export function deepCloneByStringfy<T extends object>(target: T): T {
  return target && JSON.parse(JSON.stringify(target))
}
 
/**
 * @description 'For complicated data, you use it is better.(Object who includes object type data)'
 */
 
export const deepClone = clonedeep
 
export function jsonToObject<T>(target: string, defV: unknown): T | typeof defV {
  return target ? JSON.parse(target) : defV
}
 
/**
 * @description notice: max >= min is need
 * @param min
 * @param max
 */
export function getRandomNumber(min: number, max: number) {
  return min + Math.floor((max - min) * Math.random())
}
 
/**
 * Will create a new arr, deep clone is deal
 * @param arr
 */
export function getRandomOneInArr(arr: any[]) {
  if (arr.length >= 1) {
    return deepClone(arr)[getRandomNumber(0, arr.length - 1)]
  } else {
    throw 'Array has at least one element'
  }
}
 
/**
 * Will create a new arr, deep clone is deal
 * @param arr
 */
export function getRandomArr<T extends unknown[]>(arr: T): T {
  return deepClone(arr).sort(() => 0.5 - Math.random())
}
 
/**
 * @description Map key operation for object.
 * @param target
 * @param mapKeys example ['name-value','age-label'], It means the 'name' key will change as 'value' key, and the 'age' key will change as 'label' key.
 * @param replace @default(false)||true:will replace origin key to new key. false:will add new key that will just inherit old keys' value.
 */
export function getMapkeyedObj<T>(target: { [key: string]: any }, mapKeys: string[], replace = false): T {
  const deepTarget = deepClone(target)
  for (const mapKeyStr of mapKeys) {
    const mapKeyArr = mapKeyStr.split('-')
    if (mapKeyArr[0] in deepTarget) {
      deepTarget[mapKeyArr[1]] = deepTarget[mapKeyArr[0]]
      if (replace) {
        delete deepTarget[mapKeyArr[0]]
      }
    } else {
      throw `Can't find '${mapKeyArr[0]}' key in origin target.`
    }
  }
  return deepTarget as T
}
 
/**
 * @description Generate an array of specified length.
 * @param length
 * @param callback
 */
// eslint-disable-next-line no-unused-vars
export function getLengthArr<T = undefined>(length: number, callback?: (index?: number) => T): T[] {
  return callback ? Array.from(Array(length), (value, index) => callback(index)) : Array.from(Array(length))
}
 
/**
 * @description Prefer RFC 5897 to make the download result the same as the URL directly through the A tag.
 * @param contentDisposition
 */
export function analysisFilename(contentDisposition: string): string {
  let regex = /filename\*=\S+?''(.+?)(;|$)/
  if (regex.test(contentDisposition)) {
    return RegExp.$1
  }
  regex = /filename="{0,1}([\S\s]+?)"{0,1}(;|$)/
  if (regex.test(contentDisposition)) {
    return RegExp.$1
  }
  return 'File name get exception.'
}
  |