前端通用方法之数组篇

判断是否不是空数组

export function isNotEmptyArray(arr: Array<any>) {
  return Array.isArray(arr) && arr.length > 0
}

处理数据,把空数组变成null

export function postData(arr: Array<any>, childrenName: string) {
  if (isNotEmptyArray(arr)) {
    arr.forEach((x) => {
      if (isNotEmptyArray(x[childrenName])) {
        postData(x[childrenName], childrenName)
      } else {
        x[childrenName] = null
      }
    })
  }
  return arr
}

对数组的某些字段求和

export function sumToList(origin: Array<any>, fieldList: Array<string>) {
  let obj: { [index: string]: number } = {}
  fieldList.forEach((x: string) => {
    obj[x] = 0
  })
  return origin.reduce((a, b) => {
    for (const key in a) {
      a[key] += b[key] ? Number(b[key]) : 0
    }
    return a
  }, obj)
}

从数组中查找返回需要的字段

export function ArrayFindItemValue({
  origin,
  fieldName,
  needFieldName,
  value,
  equal,
}: API.ArrayFindItemValue) {
  switch (equal) {
    case '===':
      return origin.find((x) => x[fieldName] === value)?.[needFieldName]

    default:
      return origin.find((x) => x[fieldName] == value)?.[needFieldName]
  }
}

改变某一行某个字段

export function changeFieldData({
  origin,
  fieldName,
  fieldValue,
  changeFieldName,
  changeFieldvalue,
  childrenName,
}: API.changeFieldData) {
  function loop(arr: Array<any>) {
    arr.forEach((x) => {
      if (x[fieldName] === fieldValue) {
        x[changeFieldName] = changeFieldvalue
      }
      if (isNotEmptyArray(x[childrenName])) {
        loop(x[childrenName])
      }
    })
  }
  loop(origin)
  return origin
}

改变某一行数据

export function changeRowData({
  origin,
  fieldName,
  rowData,
  childrenName,
}: API.changeRowData) {
  function loop(arr: Array<any>) {
    arr.forEach((x, i) => {
      if (x[fieldName] === rowData[fieldName]) {
        arr[i] = rowData
      }
      if (isNotEmptyArray(x[childrenName])) {
        loop(x[childrenName])
      }
    })
  }
  loop(origin)
  return origin
}

根据一个数组转换成下拉列表需要的options antd proSelect

export function ArrayToOptions({
  origin,
  labelName,
  valueName,
  showAll,
}: API.ArrayToOptions) {
  const result = origin.map((item) => {
    let name = ''
    if (typeof labelName === 'function') {
      name = labelName(item)
    } else {
      name = item[labelName]
    }
    return {
      ...item,
      label: name,
      value: item[valueName],
    }
  })
  if (showAll) {
    return [{ label: '全部', value: '' }, ...result]
  }
  return result
}

根据一个数组转换成ENUM类型 antd proSelect

export function ArrayToEnum({
  origin,
  labelName,
  valueName,
  showAll,
}: API.ArrayToEnum) {
  let obj: { [index: string]: any | { [index: string]: any } } = showAll
    ? { '': { text: '全部' } }
    : {}
  origin.forEach((item) => {
    let name = ''
    let value = ''
    if (typeof labelName === 'function') {
      name = labelName(item)
    } else {
      name = item[labelName]
    }
    if (typeof valueName === 'function') {
      value = valueName(item)
    } else {
      value = item[valueName]
    }
    if (item && Object.keys(item).length > 2) {
      obj[value] = {}
      for (const key in item) {
        if (['color', 'status'].includes(key)) {
          obj[value][key] = item[key]
        }
      }
      obj[value]['text'] = name
    } else {
      obj[value] = name
    }
  })
  return obj
}

对象数组去重 适用于对象数组和treeData

export function ObjectArrayUnique({
  origin,
  fieldName = 'id',
  childrenName = 'children',
}: API.ObjectArrayUnique): Array<any> {
  let map = new Map()
  let result: Array<any> = []
  origin.forEach((x: any) => {
    if (isNotEmptyArray(x[childrenName])) {
      x[childrenName] = ObjectArrayUnique({
        origin: x[childrenName],
        fieldName: fieldName,
        childrenName: childrenName,
      })
    }
    if (!map.get(x[fieldName])) {
      result.push(x)
      map.set(x[fieldName], 1)
    }
  })
  return result
}

value数组去重

export function ValueArrayUnique(arr: Array<any>): Array<any> {
  let map = new Map()
  let result: Array<any> = []
  arr.forEach((x) => {
    if (!map.get(x)) {
      result.push(x)
      map.set(x, 1)
    }
  })
  return result
}

全部代码


/** 判断是否不是空数组 */
export function isNotEmptyArray(arr: Array<any>) {
  return Array.isArray(arr) && arr.length > 0
}
/** 处理数据,把空数组变成null */
export function postData(arr: Array<any>, childrenName: string) {
  if (isNotEmptyArray(arr)) {
    arr.forEach((x) => {
      if (isNotEmptyArray(x[childrenName])) {
        postData(x[childrenName], childrenName)
      } else {
        x[childrenName] = null
      }
    })
  }
  return arr
}
/** 对数组的某些字段求和 */
export function sumToList(origin: Array<any>, fieldList: Array<string>) {
  let obj: { [index: string]: number } = {}
  fieldList.forEach((x: string) => {
    obj[x] = 0
  })
  return origin.reduce((a, b) => {
    for (const key in a) {
      a[key] += b[key] ? Number(b[key]) : 0
    }
    return a
  }, obj)
}
/** 从数组中查找返回需要的字段 */
export function ArrayFindItemValue({
  origin,
  fieldName,
  needFieldName,
  value,
  equal,
}: API.ArrayFindItemValue) {
  switch (equal) {
    case '===':
      return origin.find((x) => x[fieldName] === value)?.[needFieldName]

    default:
      return origin.find((x) => x[fieldName] == value)?.[needFieldName]
  }
}
/** 改变某一行某个字段 */
export function changeFieldData({
  origin,
  fieldName,
  fieldValue,
  changeFieldName,
  changeFieldvalue,
  childrenName,
}: API.changeFieldData) {
  function loop(arr: Array<any>) {
    arr.forEach((x) => {
      if (x[fieldName] === fieldValue) {
        x[changeFieldName] = changeFieldvalue
      }
      if (isNotEmptyArray(x[childrenName])) {
        loop(x[childrenName])
      }
    })
  }
  loop(origin)
  return origin
}
/** 改变某一行数据 */
export function changeRowData({
  origin,
  fieldName,
  rowData,
  childrenName,
}: API.changeRowData) {
  function loop(arr: Array<any>) {
    arr.forEach((x, i) => {
      if (x[fieldName] === rowData[fieldName]) {
        arr[i] = rowData
      }
      if (isNotEmptyArray(x[childrenName])) {
        loop(x[childrenName])
      }
    })
  }
  loop(origin)
  return origin
}
/**根据一个数组转换成下拉列表需要的options */
export function ArrayToOptions({
  origin,
  labelName,
  valueName,
  showAll,
}: API.ArrayToOptions) {
  const result = origin.map((item) => {
    let name = ''
    if (typeof labelName === 'function') {
      name = labelName(item)
    } else {
      name = item[labelName]
    }
    return {
      ...item,
      label: name,
      value: item[valueName],
    }
  })
  if (showAll) {
    return [{ label: '全部', value: '' }, ...result]
  }
  return result
}
/** 根据一个数组转换成ENUM类型 */
export function ArrayToEnum({
  origin,
  labelName,
  valueName,
  showAll,
}: API.ArrayToEnum) {
  let obj: { [index: string]: any | { [index: string]: any } } = showAll
    ? { '': { text: '全部' } }
    : {}
  origin.forEach((item) => {
    let name = ''
    let value = ''
    if (typeof labelName === 'function') {
      name = labelName(item)
    } else {
      name = item[labelName]
    }
    if (typeof valueName === 'function') {
      value = valueName(item)
    } else {
      value = item[valueName]
    }
    if (item && Object.keys(item).length > 2) {
      obj[value] = {}
      for (const key in item) {
        if (['color', 'status'].includes(key)) {
          obj[value][key] = item[key]
        }
      }
      obj[value]['text'] = name
    } else {
      obj[value] = name
    }
  })
  return obj
}
/** 对象数组去重 适用于对象数组和treeData */
export function ObjectArrayUnique({
  origin,
  fieldName = 'id',
  childrenName = 'children',
}: API.ObjectArrayUnique): Array<any> {
  let map = new Map()
  let result: Array<any> = []
  origin.forEach((x: any) => {
    if (isNotEmptyArray(x[childrenName])) {
      x[childrenName] = ObjectArrayUnique({
        origin: x[childrenName],
        fieldName: fieldName,
        childrenName: childrenName,
      })
    }
    if (!map.get(x[fieldName])) {
      result.push(x)
      map.set(x[fieldName], 1)
    }
  })
  return result
}

/** value数组去重 */
export function ValueArrayUnique(arr: Array<any>): Array<any> {
  let map = new Map()
  let result: Array<any> = []
  arr.forEach((x) => {
    if (!map.get(x)) {
      result.push(x)
      map.set(x, 1)
    }
  })
  return result
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值