Vue的table组件合并行方法

js 复制代码
/**
 * @param {Array} data - 原始数据集合
 * @param {string} addParamer - 这个是自定义的参数,向每个对象中添加一个参数 按照这个参数的个数进行合并
 * @param {} args - 剩余参数 这个是合并规则 ,比如按照时间合并 那就传入对象中的时间参数date, 如果有多个规则 例如同个时间内同一性别 那就传入date,sex,多个参数逗号隔开
 */
function mergeColunm(data, addParamer, ...args) {
  // 计算合并的数量
  let count = 0
  // 获取相同的
  let sameTimePerson = JSON.parse(JSON.stringify(data[0]))
  // 获取相同的条件的个数
  let sameTimePersonArray = []
  let samePersonIds = [];
  for (let i = 0; i < data.length; i++) {
    const currentPerson = data[i]
    let isSame = isSameValueWithKey(sameTimePerson, currentPerson, args)
    if (isSame) {
      count++
      samePersonIds.push(currentPerson.id)
    } else {
      // 把之前统计的数据添加到数组
      sameTimePerson[addParamer] = count
      sameTimePerson.samePersonIds = samePersonIds
      sameTimePersonArray.push(sameTimePerson)
      /// 置空ID数组
      samePersonIds = []
      // 把当前数据ID添加进数组
      samePersonIds.push(currentPerson.id)
      // 重置数据
      count = 1
      sameTimePerson = JSON.parse(JSON.stringify(currentPerson))
    }
    // 把最后一个数据放入数组
    if (i == data.length - 1) {
      sameTimePerson[addParamer] = count
      sameTimePerson.samePersonIds = samePersonIds
      sameTimePersonArray.push(sameTimePerson)
    }
  }

  data.forEach(item => {
    item[addParamer] = 0
    for (let i = 0; i < sameTimePersonArray.length; i++) {
      let p = sameTimePersonArray[i]
      let isSame = isSameValueWithKey(item, p, args)
      if (isSame && p.samePersonIds.indexOf(item.id) !== -1) {
        const findIndex = data.findIndex(subItem => {
          let isSame = isSameValueWithKey(subItem, p, args)
          return isSame && p.samePersonIds.indexOf(subItem.id) !== -1
        })
        data[findIndex][addParamer] = p[addParamer]
      }
    }
  })
  return data
}

function isSameValueWithKeys(objA, objB, ...args) {
  if (args.length === 0) {
    console.error('请传入对象 Key 来获取value值')
    return false
  }
  for (let key of keys) {
    if (!(key in objA) || !(key in objB)) {
      console.error('传入的Key不存在对象中')
      return false
    }
    if (objA[key] !== objB[key]) {
      return false;
    }
  }
  return true;
}

使用方法

这里以iView的Table组件为例。这里我们按照时间相同合并,并把计算的数量放在count里边。注意这里的返回值

html 复制代码
<template>
    <Table :data="resultData" border :span-method="handleSpan"></Table>
</template>
js 复制代码
// 这里我们调用合并的方法,按照date相同的进行合并,并使用count作为统计数量
// data是原始数据   resultData是处理后带有count的数据 把这个数据绑定在table上
let resultData = mergeColunm(data, 'count', 'date')

// 在这里返回想要合并的方式
handleSpan({row, column, rowIndex, columnIndex}) {
  // 假如我们想合并第四列 时间相同的行 那么就这样写
  if (columnIndex === 3) {
    return [row.count, 1];
  } 
}
相关推荐
vjmap几秒前
唯杰地图CAD图层加高性能特效扩展包发布
前端·gis
ZC跨境爬虫5 分钟前
3D 地球卫星轨道可视化平台开发 Day7(AI异步加速+卫星系列精简+AI Agent自动评论)
前端·人工智能·3d·html·json
ID_1800790547316 分钟前
淘宝 API 上货 / 商品搬家 业务场景实现 + JSON 返回示例
前端·javascript·json
M ? A20 分钟前
Vue 动态组件在 React 中,VuReact 会如何实现?
前端·javascript·vue.js·经验分享·react.js·面试·vureact
vipbic41 分钟前
独立开发复盘:我用 Uni-app + Strapi v5 肝了一个“会上瘾”的打卡小程序
前端·微信小程序
IT_陈寒2 小时前
Vite的热更新突然失效,原来是因为这个配置
前端·人工智能·后端
ZC跨境爬虫2 小时前
3D 地球卫星轨道可视化平台开发 Day8(分步渲染200颗卫星+ 前端分页控制)
前端·python·3d·重构·html
竹林8182 小时前
RainbowKit快速集成多链钱包连接,我如何从“连不上”到“丝滑切换”
前端·javascript
笨笨狗吞噬者2 小时前
Opus 4.7 使用体验
前端·ai编程
No8g攻城狮2 小时前
【前端】Vue 中 const、var、let 的区别
前端·javascript·vue.js