手写表格数据筛选

  1. 判断数据是否为空
const isEmpty = (data) => {
// 先排除掉‘’ 、null、undefined、NaN
  if(!!data) {
    if(typeof data === 'object') {
    // 排除[]和{}
      if(Object.keys(data).length === 0) {
        return true
      } else {
        return false
      }
    } else {
      return false
    }
  } else {
    return true
  }
}
  1. 判断是否满足筛选条件
// 判断每一项都是对象的两个数组是否有共同项
hasCommonItems(array1, array2) {
  const ids1 = array1.map(item => item.id);
  const ids2 = array2.map(item => item.id);
  for (let id of ids1) {
    if (ids2.includes(id)) {
      return true;
    }
  }
  return false;
}
isMeetWith(value1, value2) {
  const dataType = typeof value2;
  // 判断筛选项的数据类型
  switch (dataType) {
    case 'string':
      return value1.includes(value2);
      break;
    case 'number':
      return value1 === value2;
      break;
    case 'object':
      // 可能为{}/[{}, {}]/[, ] 即下拉框模式 目前所有下拉框都是多选模式 所以排除{}情况
      const isExistence = value2.findIndex(i => {
        const iType = typeof i;
        if (iType === 'object') {
          // 数组中每一项为对象 即[{}, {}]
          if (value1?.length) {
            // 如果表格数据中该字段值为数组 只需判断与筛选条件是否有重合即可
            return hasCommonItems(value1, value2)
          } else if (value1?.length === 0) {
            // 如果表格中该属性值为空 则直接判断为不满足条件
            return false;
          } else {
            // 如果表格数据中该字段值为非数组
            return value1.id === value2.id;
          }
        } else {
          // 数组中每一项为字符串或者数字 即[, ]
          return value1 == i
        }
      })
      return isExistence !== -1
      break;
  }
}
  1. 过滤表格数据
tableDataFilter(tableData, primaryData, searchObj) {
  const searchKeys = Object.keys(searchObj);
  tableData = primaryData.filter(data => {
      const res = searchKeys.map(key => {
      	// 筛选项为空 则每一项数据都满足条件
        if (isEmpty(searchObj[key])) {
          return true;
        } else if (!data[key]) {
        // 表格中该属性没有值 则不满足条件(该判断未过滤掉[]和{})
          return false;
        } else {
        // 筛选条件和表格属性都有值
          return isMeetWith(data[key], searchObj[key]);
        }
      })
      return res.every(i => i)
    });
}

写的仓促 若有失误 烦请指点

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值