复杂数据的处理

112 阅读1分钟

数组数据的处理

1. 对象数组的去重

对象数组中某个属性相同的元素进行去重

2. 对象数组的合并

在某些情况下,我们需要将数组中某个属性相同的元素进行合并处理,而不仅仅是去重。

如下,

let newArr = []
for (let i = 0; i < originArr.length; i++) {
  let flag = false

  for (let j = 0; j < newArr.length; j++) {
    if (newArr[j].label === originArr[i].label) {
      newArr[j].children.push(...originArr[i].children)
      flag = true
      break
    }
  }

  if (!flag) {
    newArr.push(originArr[i])
  }
}

对象数据的处理

1. 根据条件筛选对象的属性

/**
*  originObj 是需要筛选的源对象
*  judgeFn 是筛选的判断逻辑
*/
function filterData(originObj, judgeFn) {
  const targetObj = {}

  for (const key in originObj) {
    const val = originObj[key]
    if (judgeFn(key, val)) {
      targetObj[key] = val
    }
  }
  
  return targetObj
}

1.1 根据对象的属性名筛选

/**
*  originObj, 需要筛选的源对象
*  keys, 需要筛选的属性名,可传入字符串或数组
*  isDelete, 判断是根据 keys 筛选出属性还是筛选掉属性,boolean 类型
*/
function filterByKeys(originObj, keys, isDelete) {
  return filterData(originObj, (key) => {
    if (!(keys instanceof Array)) {
      keys = [keys]
    }
    // 根据 keys 筛选符合的属性
    if (!isDelete) {
      if (keys.includes(key)) {
        return true
      }
    } else {
    // 根据 keys 筛选不符合的属性
    if (!keys.includes(key)) {
      return true
    }
   }
 })
}

1.2 根据对象的属性值来筛选

/**
*  originObj, 需要筛选的源对象
*  values, 需要筛选的属性值,可传入字符串或数组
*  isDelete, 判断是根据 values 筛选出属性还是筛选掉属性,boolean 类型
*/
function filterByValues(originObj, values, isDelete) {
  return filterData(originObj, (key, val) => {
    if (!(values instanceof Array)) {
      values = [values]
    }
    // 根据 values 筛选符合的属性
    if (!isDelete) {
      if (values.includes(val)) {
        return true
      }
    } else {
    // 根据 values 筛选不符合的属性
    if (!values.includes(val)) {
      return true
    }
   }
 })
}