前言
大家好 我是歌谣 今天需要进行一个数据处理的问题
原始数据到目标数据的处理过程 数据处理的过程就是逻辑推理的过程 类似一道数学题的解法 原始数据格式(本次以两组数据格式为例Rawdata)
[
{
"id": 1047,
"name": "README.md",
"manufacture_id": 176,
"materiel_id": 3555,
"lead_time": null,
"is_layer": 1,
"cloth_width": null,
"mark": null,
"t_base_materiel": {
"id": 3555,
"code": "ML-QT0184",
"name": "25D涤纶密可柔",
"color": "黑色/8056"
},
"cut_scheme_detail": [
{
"id": 2667,
"size_id": 135,
"ratio": 13,
"layer": 0,
"t_base_size": {
"id": 135,
"name": "165"
}
},
{
"id": 2668,
"size_id": 136,
"ratio": 13,
"layer": 0,
"t_base_size": {
"id": 136,
"name": "170"
}
},
{
"id": 2669,
"size_id": 137,
"ratio": 13,
"layer": 0,
"t_base_size": {
"id": 137,
"name": "175"
}
},
{
"id": 2670,
"size_id": 157,
"ratio": 13,
"layer": 0,
"t_base_size": {
"id": 157,
"name": "160"
}
},
{
"id": 2671,
"size_id": 277,
"ratio": 13,
"layer": 0,
"t_base_size": {
"id": 277,
"name": "155"
}
}
]
},
{
"id": 1048,
"name": "README.md",
"manufacture_id": 176,
"materiel_id": 3555,
"lead_time": null,
"is_layer": 1,
"cloth_width": null,
"mark": null,
"t_base_materiel": {
"id": 3555,
"code": "ML-QT0184",
"name": "25D涤纶密可柔",
"color": "黑色/8056"
},
"cut_scheme_detail": [
{
"id": 2672,
"size_id": 135,
"ratio": 12,
"layer": 0,
"t_base_size": {
"id": 135,
"name": "165"
}
},
{
"id": 2673,
"size_id": 136,
"ratio": 12312,
"layer": 0,
"t_base_size": {
"id": 136,
"name": "170"
}
},
{
"id": 2674,
"size_id": 137,
"ratio": 1231,
"layer": 0,
"t_base_size": {
"id": 137,
"name": "175"
}
},
{
"id": 2675,
"size_id": 157,
"ratio": 12,
"layer": 0,
"t_base_size": {
"id": 157,
"name": "160"
}
},
{
"id": 2676,
"size_id": 277,
"ratio": 12,
"layer": 0,
"t_base_size": {
"id": 277,
"name": "155"
}
},
{
"id": 2677,
"size_id": 135,
"ratio": 12123,
"layer": 1,
"t_base_size": {
"id": 135,
"name": "165"
}
},
{
"id": 2678,
"size_id": 136,
"ratio": 12312,
"layer": 1,
"t_base_size": {
"id": 136,
"name": "170"
}
},
{
"id": 2679,
"size_id": 137,
"ratio": 112,
"layer": 1,
"t_base_size": {
"id": 137,
"name": "175"
}
},
{
"id": 2680,
"size_id": 157,
"ratio": 12312,
"layer": 1,
"t_base_size": {
"id": 157,
"name": "160"
}
},
{
"id": 2681,
"size_id": 277,
"ratio": 1231,
"layer": 1,
"t_base_size": {
"id": 277,
"name": "155"
}
}
]
}
]
原始column直接变量声明(RawColumns)
[{ title: "物料代码", dataIndex: "materielCode", key: "materielCode" }, { title: "物料名称", dataIndex: "materielName", key: "materielName" }, { title: "颜色", dataIndex: "color", key: "color", }, { title: "方案名称", dataIndex: "name", key: "name", }, { title: "是否拉高低层", dataIndex: "isLayer", key: "isLayer", }, { title: "门幅宽", dataIndex: "width", key: "width" }, ]
目标数据格式
1需要拆解为dataSource和dataColumn格式 目标的过程都是推理的过程(首先我们考虑不合并的表头状态 省略号表示带处理的动态尺码部分) 变化1:dataColumn数据格式变化
[{
title: "物料代码",
dataIndex: "materielCode",
key: "materielCode"
},
{
title: "物料名称",
dataIndex: "materielName",
key: "materielName"
},
{
title: "颜色",
dataIndex: "color",
key: "color",
},
{
title: "方案名称",
dataIndex: "name",
key: "name",
},
{
title: "是否拉高低层",
dataIndex: "isLayer",
key: "isLayer",
},
{
title: "门幅宽",
dataIndex: "width",
key: "width"
},
]
dataSource数据格式(最终数据格式)
[
{
"155": 12,
"160": 12,
"165": 12,
"170": 12312,
"175": 1231,
"materielCode": "ML-QT0184",
"materielName": "25D涤纶密可柔",
"name": "README.md",
"isLayer": "是",
"width": null,
"color": "黑色/8056",
"mark": null,
"layer": 0
},
{
"155": 1231,
"160": 12312,
"165": 12123,
"170": 12312,
"175": 112,
"materielCode": "ML-QT0184",
"materielName": "25D涤纶密可柔",
"name": "README.md",
"isLayer": "是",
"width": null,
"color": "黑色/8056",
"mark": null,
"layer": 1
}
]
需要做出动态表头拼接的数据格式(表头数据处理)
拿出所有的尺码 形成数组 处理过程
第一步 所有尺码形成数组 定义变量arr=[]
Rawdata && Rawdata.map((item, index) => {
item.cut_scheme_detail && item.cut_scheme_detail.map((item, index) => {
arr.push(item.t_base_size.name)
})
})
第二步 去重操作
const data = Array.from(new Set(arr))
第三步 拼接得到表头
data && data.map((item, index) => {
RawColumns.push({
title: item,
dataIndex: item,
key: item
})
})
结果:此时表头数据处理完成
[
{
"title": "物料代码",
"dataIndex": "materielCode",
"key": "materielCode"
},
{
"title": "物料名称",
"dataIndex": "materielName",
"key": "materielName"
},
{
"title": "颜色",
"dataIndex": "color",
"key": "color"
},
{
"title": "方案名称",
"dataIndex": "name",
"key": "name"
},
{
"title": "是否拉高低层",
"dataIndex": "isLayer",
"key": "isLayer"
},
{
"title": "门幅宽",
"dataIndex": "width",
"key": "width"
},
{
"title": "165",
"dataIndex": "165",
"key": "165"
},
{
"title": "170",
"dataIndex": "170",
"key": "170"
},
{
"title": "175",
"dataIndex": "175",
"key": "175"
},
{
"title": "160",
"dataIndex": "160",
"key": "160"
},
{
"title": "155",
"dataIndex": "155",
"key": "155"
}
]
第四步 紧接着就是datsource格式处理的过程
定义变量arr1=[]
Rawdata && Rawdata.map((item, index) => {
item.cut_scheme_detail.map((item1, index1) => {
arr1.push(
{
materielCode: item.t_base_materiel.code,
materielName: item.t_base_materiel.name,
name: item.name,
leadTime: item.leadTime,
isLayer: item.is_layer == 1 ? "是" : "否",
width: item.cloth_width,
color: item.t_base_materiel.color,
mark: item.mark,
layer:item1.layer,
[`${item1.t_base_size.name}`]: item1.ratio
})
})
})
结果:arr1处理完成数据为
[
{
"165": 1,
"materielCode": "ML-QT0184",
"materielName": "25D涤纶密可柔",
"name": "package.json",
"isLayer": "是",
"width": null,
"color": "黑色/8056",
"mark": null,
"layer": 0
},
{
"170": 1,
"materielCode": "ML-QT0184",
"materielName": "25D涤纶密可柔",
"name": "package.json",
"isLayer": "是",
"width": null,
"color": "黑色/8056",
"mark": null,
"layer": 0
},
{
"175": 1,
"materielCode": "ML-QT0184",
"materielName": "25D涤纶密可柔",
"name": "package.json",
"isLayer": "是",
"width": null,
"color": "黑色/8056",
"mark": null,
"layer": 0
},
{
"160": 1,
"materielCode": "ML-QT0184",
"materielName": "25D涤纶密可柔",
"name": "package.json",
"isLayer": "是",
"width": null,
"color": "黑色/8056",
"mark": null,
"layer": 0
},
{
"155": 1,
"materielCode": "ML-QT0184",
"materielName": "25D涤纶密可柔",
"name": "package.json",
"isLayer": "是",
"width": null,
"color": "黑色/8056",
"mark": null,
"layer": 0
},
{
"165": 2,
"materielCode": "ML-QT0184",
"materielName": "25D涤纶密可柔",
"name": "package.json",
"isLayer": "是",
"width": null,
"color": "黑色/8056",
"mark": null,
"layer": 1
},
{
"170": 2,
"materielCode": "ML-QT0184",
"materielName": "25D涤纶密可柔",
"name": "package.json",
"isLayer": "是",
"width": null,
"color": "黑色/8056",
"mark": null,
"layer": 1
},
{
"175": 2,
"materielCode": "ML-QT0184",
"materielName": "25D涤纶密可柔",
"name": "package.json",
"isLayer": "是",
"width": null,
"color": "黑色/8056",
"mark": null,
"layer": 1
},
{
"160": 2,
"materielCode": "ML-QT0184",
"materielName": "25D涤纶密可柔",
"name": "package.json",
"isLayer": "是",
"width": null,
"color": "黑色/8056",
"mark": null,
"layer": 1
},
{
"155": 2,
"materielCode": "ML-QT0184",
"materielName": "25D涤纶密可柔",
"name": "package.json",
"isLayer": "是",
"width": null,
"color": "黑色/8056",
"mark": null,
"layer": 1
}
]
这样的数据格式还是不满足条件 接着就是继续对arr1进行数据处理(typeof去判断对象的键是不是数字类型插入 arr2是一个对象 利用层数+对象属性名拼接形成对象) 定义一个对象arr2接收arr2={}
arr1&&arr1.map((item,index)=>{
Object.keys(item).map((key)=>{
if(typeof(key)=="number"){
arr2[`${key}-${item.layer}`]=item[key]
}else{
arr2[`${key}-${item.layer}`]=item[key]
}
})
})
结果格式处理为:
这样的数据格式还是不满足条件 但是距离我们的目标已经接近
{
"165-0": 1,
"materielCode-0": "ML-QT0184",
"materielName-0": "25D涤纶密可柔",
"name-0": "package.json",
"isLayer-0": "是",
"width-0": null,
"color-0": "黑色/8056",
"mark-0": null,
"layer-0": 0,
"170-0": 1,
"175-0": 1,
"160-0": 1,
"155-0": 1,
"165-1": 2,
"materielCode-1": "ML-QT0184",
"materielName-1": "25D涤纶密可柔",
"name-1": "package.json",
"isLayer-1": "是",
"width-1": null,
"color-1": "黑色/8056",
"mark-1": null,
"layer-1": 1,
"170-1": 2,
"175-1": 2,
"160-1": 2,
"155-1": 2
}
最后最后 封装一个函数进行处理
export function myFunc(obj: any) {
const newObj: any = {}
for (const [key, value] of Object.entries(obj)) {
const strList = key.split('-')
const groupId = strList.pop() // 拿到最后一个"-"之后的字符
const keyName = strList.join('') // 最后一个"-"之前的所有字符再加起来(理论上如果只有一个"-"可以直接key.split('-')[0]和key.split('-')[1])
if (!newObj[groupId as string]) {
newObj[groupId as string] = {}
}
newObj[groupId as string][keyName] = value
}
console.log(Object.values(newObj))
return Object.values(newObj)
}
定义变量arr3=[]
arr3= myFunc(arr2)
结果最后就是我们需要的datasource格式
[
{
"155": 1,
"160": 1,
"165": 1,
"170": 1,
"175": 1,
"materielCode": "ML-QT0184",
"materielName": "25D涤纶密可柔",
"name": "package.json",
"isLayer": "是",
"width": null,
"color": "黑色/8056",
"mark": null,
"layer": 0
},
{
"155": 2,
"160": 2,
"165": 2,
"170": 2,
"175": 2,
"materielCode": "ML-QT0184",
"materielName": "25D涤纶密可柔",
"name": "package.json",
"isLayer": "是",
"width": null,
"color": "黑色/8056",
"mark": null,
"layer": 1
}
]
3 最后就是我们的合并操作的 他是在render中进行的
export function filterNumData(obj: any, arr: any, record: any, index: number, flag: any) {
let length: number = 0
if (arr.length > 0) {
for (let i = index; i < arr.length; i++) {
if (i === arr.length - 1 && arr.length != 1) {
if (arr[i - 1][`${flag}`] === record[`${flag}`]) {
length += 1
break
}
} else {
if (arr[i][`${flag}`] === record[`${flag}`]) {
length += 1
} else {
break
}
}
}
}
if (index == 0 || arr[index - 1][`${flag}`] != record[`${flag}`]) {
// 匹配到相同数据的长度
obj.props.rowSpan = length;
} else {
// 如果上一行的数据与当前的数据相同,就将rowSpan变为0
obj.props.rowSpan = 0;
}
return obj
}
只要在对应的表头中调用我们的filterNumber函数 就进行了合并操作
{
title: "颜色",
dataIndex: "color",
key: "color",
render: (value: any, record: any, index: any) => {
// 处理列,相同数据则合并
// 处理rowSpan
const obj = {
children: value,
props: { rowSpan: 1 },
};
return filterNumData(obj, arr1, record, index, 'color')
},
},
{
title: "方案名称",
dataIndex: "name",
key: "name",
render: (value: any, record: any, index: any) => {
// 处理列,相同数据则合并
// 处理rowSpan
const obj = {
children: value,
props: { rowSpan: 1 },
};
return filterNumData(obj, arr1, record, index, 'name')
},
},