简体   繁体   English

如何重新映射要在 Ant 设计树中使用的数组

[英]How to re-map an array to use in Ant Design Tree

I have this code structure:我有这个代码结构:

const data = [
  {
    name: 'Lebron',
    sports: 'Basketball',
  },
  {
    name: 'Durant',
    sports: 'Basketball',
  },
  {
    name: 'Federrer',
    sports: 'Tennis',
  },
  {
    name: 'Nadal',
    sports: 'Tennis',
  },
];

and I'm trying to transform it into this:我正在尝试将其转换为:

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',
          },
        ],
      },
    ],
  },
];

to use in Ant Design Tree link .在 Ant Design Tree链接中使用

Right now my plan is to get all the sports like this:现在我的计划是让所有的运动都像这样:

let sports = data.map(({ sports }) => sports); 
sports = [...new Set(sports)];

but after that I have no idea on what should be my next step to achieve the treeData但在那之后我不知道下一步应treeData来实现treeData

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
        }))
    }))
}]

Here's a two-steps way of get the children of your final object:这是获取最终对象的孩子的两步方法:

First, use a reduce to create an object of sports/children, where children matches what you have in your final output:首先,使用reduce 创建一个sports/children 对象,其中children 匹配您在最终输出中的内容:

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;
}, {});

Then map the results of the reduce function to reshape the object:然后映射reduce函数的结果来重塑对象:

const results = Object.entries(middle).map(([key, children]) => ({
  title: key,
  key,
  children
}));

You can use .reduce() to accumulate all sports to a Map , where each sport is a key and each value for the sport is an array of associated name s.您可以使用.reduce()将所有运动累积到Map ,其中每个运动是一个键,运动的每个值是一个关联name的数组。 Once you have built the Map, you can use Array.from() to convert your map into your desired children array.构建地图后,您可以使用Array.from()将地图转换为所需的children数组。 This can be done by providing a mapping function as the second argument to Array.from(), and using it to convert each entry ( [key, value] ) pair to an object of your desired structure.这可以通过提供一个映射函数作为 Array.from() 的第二个参数来完成,并使用它来将每个条目 ( [key, value] ) 对转换为所需结构的对象。

See example below:请参阅下面的示例:

 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.set(sports, [...(m.get(sports) || []), name]) , new Map), ([key, arr]) => ({title: key, key, children: arr.map(title => ({title, key: title}))})); const treeData = [{title: 'Select All', key: 'All', children}]; console.log(treeData);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM