背景
在平常的业务中,后端同学会返回以下类似的结构数据
javascript
// 后端返回的数据结构
[
{ id: 1, product_id: 1, pid_name: "Asia", name: "HKG01" },
{ id: 2, product_id: 1, pid_name: "Asia", name: "SH01" },
{ id: 3, product_id: 2, pid_name: "Europe", name: "NY04" },
{ id: 4, product_id: 2, pid_name: "Europe", name: "HK02" },
{ id: 5, product_id: 2, pid_name: "Europe", name: "HK10" },
{ id: 6, product_id: 1, pid_name: "Asia", name: "HKG05" }
]
前端展示时需要归类展示 ,因此需要构造 类似[{parent: "xx", child: [{xx},{xx}]}] 这样的数据
javascript
// 前端处理后的结构
[
{
parent: "Asia",
child: [
{ id: 1, product_id: 1, pid_name: "Asia", name: "HKG01" },
{ id: 2, product_id: 1, pid_name: "Asia", name: "SH01" },
{ id: 5, product_id: 1, pid_name: "Asia", name: "HKG05" }
]
} ,
{
parent: "Europe",
child: [
{ id: 3, product_id: 2, pid_name: "Europe", name: "NY04" },
{ id: 4, product_id: 2, pid_name: "Europe", name: "HK02" },
{ id: 4, product_id: 2, pid_name: "Europe", name: "HK10" }
]
}
]
合并数组对象中key相同的数据
构造 [ { parent: "xx", child: [ { xx }, { xx } ] } ] ,需要传入数据源,匹配合并的键
javascript
type MergeByKeyParam<T> = {
dataSource: Array<T>; // 数据源
key: string; // 匹配的键
prop: string; // 匹配的键名
};
type MergeByKeyResult<T> = {
parent: string;
child: Array<T>;
};
export const mergeByKey = <T>({ dataSource, key, prop }: MergeByKeyParam<T>): Array<MergeByKeyResult<T>> => {
const dataObj = {};
for (const item of dataSource) {
if (!dataObj[item[key]]) {
dataObj[item[key]] = {
parent: item[prop],
child: []
};
}
dataObj[item[key]].child.push(item);
}
return Object.values(dataObj);
};
javascript
const showRegionList = (regionArr: ICoupon.AvailabilityZone[]) => {
return mergeByKey<ICoupon.AvailabilityZone>({ dataSource: regionArr, key: "pid", prop: "pid_name" });
};
最终的展示