Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何重新映射要在Ant设计树中使用的数组_Javascript_Reactjs_Typescript_Ecmascript 6_Antd - Fatal编程技术网

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)