Javascript 如何重新映射要在Ant设计树中使用的数组
我有这样的代码结构:Javascript 如何重新映射要在Ant设计树中使用的数组,javascript,reactjs,typescript,ecmascript-6,antd,Javascript,Reactjs,Typescript,Ecmascript 6,Antd,我有这样的代码结构: const data = [ { name: 'Lebron', sports: 'Basketball', }, { name: 'Durant', sports: 'Basketball', }, { name: 'Federrer', sports: 'Tennis', }, { name: 'Nadal', sports: 'Tennis', }, ]; 我正试图将其转
const data = [
{
name: 'Lebron',
sports: 'Basketball',
},
{
name: 'Durant',
sports: 'Basketball',
},
{
name: 'Federrer',
sports: 'Tennis',
},
{
name: 'Nadal',
sports: 'Tennis',
},
];
我正试图将其转化为:
const treeData = [
{
title: 'Select All',
key: 'All',
children: [
{
title: 'Basketball',
key: 'Basketball',
children: [
{
title: 'Lebron',
key: 'Lebron',
},
{
title: 'Durant',
key: 'Durant',
},
],
},
{
title: 'Tennis',
key: 'Tennis',
children: [
{
title: 'Federrer',
key: 'Federrer',
},
{
title: 'Nadal',
key: 'Nadal',
},
],
},
],
},
];
在Ant设计树中使用
现在我的计划是让所有的运动都像这样:
let sports = data.map(({ sports }) => sports);
sports = [...new Set(sports)];
但是在那之后,我不知道下一步应该做什么来实现treeData
const data=[
const data = [
{
name: 'Lebron',
sports: 'Basketball',
},
{
name: 'Durant',
sports: 'Basketball',
},
{
name: 'Federrer',
sports: 'Tennis',
},
{
name: 'Nadal',
sports: 'Tennis',
},
];
const dataMap: Record<string, string[]> = {};
data.forEach(({ name, sports }) => {
dataMap[sports] ??= []
dataMap[sports].push(name)
})
const treeData = [{
title: 'Select All',
key: 'All',
children: Object.entries(dataMap).map(([sport, names]) => ({
title: sport,
key: sport,
children: names.map(name => ({
title: name,
key: name
}))
}))
}]
{
名称:“勒布朗”,
体育:"篮球",,
},
{
名称:“杜兰特”,
体育:"篮球",,
},
{
姓名:“费德勒”,
体育:"网球",,
},
{
名称:“纳达尔”,
体育:"网球",,
},
];
const dataMap:Record={};
data.forEach({name,sports})=>{
数据地图[运动]??=[]
dataMap[sports].push(名称)
})
常数treeData=[{
标题:“全选”,
键:“全部”,
子项:Object.entries(dataMap.map)([sport,name])=>({
标题:体育,
重点:体育,
子项:names.map(name=>({
标题:姓名,
关键字:姓名
}))
}))
}]
常量数据=[
{
名称:“勒布朗”,
体育:"篮球",,
},
{
名称:“杜兰特”,
体育:"篮球",,
},
{
姓名:“费德勒”,
体育:"网球",,
},
{
名称:“纳达尔”,
体育:"网球",,
},
];
const dataMap:Record={};
data.forEach({name,sports})=>{
数据地图[运动]??=[]
dataMap[sports].push(名称)
})
常数treeData=[{
标题:“全选”,
键:“全部”,
子项:Object.entries(dataMap.map)([sport,name])=>({
标题:体育,
重点:体育,
子项:names.map(name=>({
标题:姓名,
关键字:姓名
}))
}))
}]
以下是获取最终对象的子对象的两步方法:
首先,使用reduce创建运动/儿童对象,其中儿童与最终输出中的内容相匹配:
const middle = data.reduce((transformed, item) => {
if (!transformed[item.sports]) {
transformed[item.sports] = [];
}
transformed[item.sports].push({
title: item.name,
key: item.name
});
return transformed;
}, {});
然后映射reduce函数的结果以重塑对象:
const results = Object.entries(middle).map(([key, children]) => ({
title: key,
key,
children
}));
以下是获取最终对象的子对象的两步方法: 首先,使用reduce创建运动/儿童对象,其中儿童与最终输出中的内容相匹配:
const middle = data.reduce((transformed, item) => {
if (!transformed[item.sports]) {
transformed[item.sports] = [];
}
transformed[item.sports].push({
title: item.name,
key: item.name
});
return transformed;
}, {});
然后映射reduce函数的结果以重塑对象:
const results = Object.entries(middle).map(([key, children]) => ({
title: key,
key,
children
}));
您可以使用将所有运动累积到,其中每个运动是一个键,运动的每个值是一个关联的name
s数组。构建地图后,可以使用将地图转换为所需的子对象数组。这可以通过提供映射函数作为Array.from()的第二个参数来实现,并使用它将每个条目([key,value]
)对转换为所需结构的对象
见下例:
const data=[{name:'Lebron',sports:'Basketball',},{name:'Durant',sports:'Basketball',},{name:'Federrer',sports:'Tennis',},{name:'Nadal',sports:'Tennis',},];
const children=Array.from(data.reduce((m,{name,sports})=>
m、 集合(运动,[…(m.get(运动)| |[]),名称])
,新映射),([key,arr])=>({title:key,key,children:arr.Map(title=>({title,key:title}));
const treeData=[{title:'Select All',key:'All',children}];
控制台日志(treeData)代码>您可以使用将所有运动累积到,其中每个运动都是一个键,运动的每个值都是关联的名称的数组。构建地图后,可以使用将地图转换为所需的子对象数组。这可以通过提供映射函数作为Array.from()的第二个参数来实现,并使用它将每个条目([key,value]
)对转换为所需结构的对象
见下例:
const data=[{name:'Lebron',sports:'Basketball',},{name:'Durant',sports:'Basketball',},{name:'Federrer',sports:'Tennis',},{name:'Nadal',sports:'Tennis',},];
const children=Array.from(data.reduce((m,{name,sports})=>
m、 集合(运动,[…(m.get(运动)| |[]),名称])
,新映射),([key,arr])=>({title:key,key,children:arr.Map(title=>({title,key:title}));
const treeData=[{title:'Select All',key:'All',children}];
控制台日志(treeData)代码>