详解js如何优雅处理后端返回的单元格数据

作者:夜航船时间:2026-10-31 07:37:02浏览:658

本文详解如何处理后端以单元格为单位返回的数据,通过JavaScript将扁平的单元格对象重组为标准的行数组结构,从而适配常规表格组件的渲染要求。文章提供了动态生成列配置、初始化行数据及处理空值的完整代码逻辑,帮助开发者优雅解决非标准数据格式导致的渲染难题。

问题背景与需求分析

在开发中,我们通常需要渲染一个4行3列的表格。若后端返回的数据格式为标准行对象数组,只需配置好columns数组和dataSource数据源,当两者属性对应时即可正常渲染。然而,当后端不按行返回数据,而是将每个单元格的数据作为独立对象返回时,前端就需要自行按行处理这些数据。接下来分享一种处理思路。

解题思路

解题思路主要包含两步:首先,无论后端返回多少条数据,前端需明确最终需要展示的行数,即定义一个包含相应数量对象的数组。其次,根据后端返回的每个单元格中的两个字段(如行号和列号)唯一确定其位置,然后按行列关系取出对应单元格数据,将其添加到刚才创建的数组中,从而实现成功渲染。

具体实现步骤

具体实现步骤如下:

第一步是定义tableColumns。在此场景中,列数和行数相等,数据是动态的,通过遍历num值来渲染得到列配置。

动态生成列配置

  computed: {
    tableColumns() {
      this.list = []
      let columnsTemp = public_deepCopy(this.columns);
      for (let i = 0; i < this.num; i++) {
        this.list.push({
          title: i + 1,
          dataIndex: i + 1,
          key: i + 1,
          align: 'center',
          scopedSlots: {customRender: i + 1}
        });
      }
      columnsTemp.push(...this.list)
      return columnsTemp
    }
  }

初始化行数据函数

第二步是定义一个函数,用于初始化行数据,以便更好地处理后端返回的原始数据。

后端数据格式解析

首先观察后端返回的数据格式,以便理解数据结构。

问题背景与需求分析

在本例中,num和sort字段可以唯一确定单元格的位置。其中,num代表行号,sort代表列号。

接下来,我们开始定义函数以初始化行数据,确保数据结构符合前端渲染要求。

核心处理逻辑

getArray(arr) {
  // 初始化行,这里根据num的值确定需要几行,创建包含几个对象的空数据
  const rows = Array.from({length: this.num}, () => ({}));
  // 根据num也就是行数-1,确定索引,我们可以知道像一行添加数据,在将sort作为对象的属性名,item作为属性值将数据存储到对应的位置
  arr.forEach(item => {
    rows[item.num - 1][item.sort] = {
      ...item,
      score: item.numerator && item.denominator ? item.numerator + '/' + item.denominator : ''
    };
  });
  // 因为有的单元格没有数据,所以进行判断将空位置填充为null
  rows.forEach(row => {
    for (let i = 1; i <= this.num; i++) {
      if (!row.hasOwnProperty(i)) {
        row[i] = null;
      }
    }
  });
  //最后将处理好的数据返回
  return rows;
},

接口调用与数据转换

调用接口获取并处理数据,将后端返回的原始数据转换为前端可用的格式。

async queryTemplate() {
  this.loading = true
  const res = await queryWorkAllocationModule({
    moduleId: this.moduleId
  });
  this.loading = false;
  if (res.state === 200) {
    this.dataSource = this.getArray(res.data);
  } else {
    this.$message.error(res.message)
  }
},

处理后的数据结构如下所示,这样就能与上面定义的tableColumns数组中包含的对象属性进行一一映射对应。

问题背景与需求分析

问题背景与需求分析

最后,将处理好的数据源传入表格组件进行渲染。

表格组件渲染

<a-table
    :columns="tableColumns"
    :data-source="dataSource"
    :loading="loading"
    :pagination="false"
    :rowKey="record => record.id"
    bordered
>
  <template slot="headerName">
    <div style="position:relative;width:100px;">
      <div style="text-align: right;">排名</div>
      <div style="text-align: left;">人数</div>
    </div>
  </template>
  <template slot="header" slot-scope="text, record, index">
    {{ index + 1 }}
  </template>
  <template v-for="item in num" :slot="item" slot-scope="text, record, index">
    <a-input v-if="record[item] && commenttype" :key="index"
             v-model="text.score" placeholder="请输入" style="text-align: center;border: none"></a-input>
    <span v-if="record[item] && !commenttype">{{ text.score }}</span>
  </template>
</a-table>

以下是最终的效果展示图,验证数据渲染的正确性。

问题背景与需求分析

经过上述数据处理流程,表格可以正确地被渲染出来,实现了从后端单元格数据到前端标准表格展示的转换。

到此,关于详解js如何优雅处理后端返回的单元格数据的文章就介绍到这了。更多相关js处理后端返回数据的内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

作者最新文章