这个树形结构怎么转换?


let arr = [
                                        {day:2021-1-1,day1:'全天',time:00:00,name:123},
                                        {day:2021-1-1,day1:'全天',time:00:00,name:456},
                                        {day:2021-1-1,day1:'非全天',time:10:00,name:789},
                                        {day:2021-1-2,day1:'非全天',time:10:00,name:777},
                                        {day:2021-1-2,day1:'非全天',time:10:00,name:888},
                                    ]

运行结果

let List=[
                                        {
                                            day:2021-1-1,
                                           children:[
                                               {
                                                    time:00:00,
                                                    children:[
                                                        {day:2021-1-1,day1:'全天',time:00:00,name:123},
                                                        {day:2021-1-1,day1:'全天',time:00:00,name:456},
                                                    ],
                                                },
                                                {
                                                    time:10:00,
                                                    children:[
                                                        {day:2021-1-1,day1:'非全天',time:10:00,name:789},
                                                    ]
                                                }
                                           ],
                                        },
                                        {
                                            day:2021-1-2,
                                            children:[
                                                {
                                                    time:10:00,
                                                    children:[
                                                        {day:2021-1-2,day1:'非全天',time:10:00,name:777},
                                                        {day:2021-1-2,day1:'非全天',time:10:00,name:888},
                                                    ],
                                                }
                                            ]
                                        }
                                    ]
```javascript


```


let List = [];

for (let i = 0; i < arr.length; i++) {
  let item = arr[i];
  let dayIndex = -1;
  for (let j = 0; j < List.length; j++) {
    if (List[j].day === item.day) {
      dayIndex = j;
      break;
    }
  }
  if (dayIndex === -1) {
    List.push({
      day: item.day,
      children: []
    });
    dayIndex = List.length - 1;
  }
  let timeIndex = -1;
  for (let j = 0; j < List[dayIndex].children.length; j++) {
    if (List[dayIndex].children[j].time === item.time) {
      timeIndex = j;
      break;
    }
  }
  if (timeIndex === -1) {
    List[dayIndex].children.push({
      time: item.time,
      children: []
    });
    timeIndex = List[dayIndex].children.length - 1;
  }
  List[dayIndex].children[timeIndex].children.push(item);
}

该回答引用GPTᴼᴾᴱᴺᴬᴵ
可以使用 JavaScript 中的 reduce 方法对原始数组进行遍历和转换。以下是一个可能的解决方案:

let arr = [
  {day: "2021-1-1", day1: '全天', time: "00:00", name: 123},
  {day: "2021-1-1", day1: '全天', time: "00:00", name: 456},
  {day: "2021-1-1", day1: '非全天', time: "10:00", name: 789},
  {day: "2021-1-2", day1: '非全天', time: "10:00", name: 777},
  {day: "2021-1-2", day1: '非全天', time: "10:00", name: 888},
];

let List = arr.reduce((result, item) => {
  // 根据日期查找是否已经存在该日期的数据
  let date = result.find(date => date.day === item.day);
  if (!date) {
    // 如果不存在,就创建一个新的日期节点
    date = {
      day: item.day,
      children: []
    };
    result.push(date);
  }

  // 根据时间查找是否已经存在该时间段的数据
  let time = date.children.find(time => time.time === item.time);
  if (!time) {
    // 如果不存在,就创建一个新的时间段节点
    time = {
      time: item.time,
      children: []
    };
    date.children.push(time);
  }

  // 将当前的数据节点添加到时间段节点的子节点数组中
  time.children.push({
    day: item.day,
    day1: item.day1,
    time: item.time,
    name: item.name
  });

  return result;
}, []);

console.log(List);


解释一下:

  1. 使用 reduce 方法对原始数组进行遍历,并返回转换后的结果;
  2. 对于每个数组元素,先查找日期节点是否已经存在,如果不存在则创建一个新的日期节点;
  3. 在日期节点中查找时间段节点是否已经存在,如果不存在则创建一个新的时间段节点;
  4. 将当前的数据节点添加到时间段节点的子节点数组中;
  5. 最后返回转换后的数组。