数据结构处理:先根据日期分组,再根据车站分组,最后根据票种分组,计算总和。

后台返回的数据源是没有进行分组的

let arr=[{
        time: '2.28',
        station: '武昌站',
        kind: '火车',
        count: 30
    },
    {
        time: '2.28',
        station: '汉口站',
        kind: '飞机',
        count: 10
    },
    {
        time: '2.28',
        station: '武汉站',
        kind: '火车',
        count: 20
    },
    {
        time: '2.28',
        station: '武汉站',
        kind: '火车',
        count: 40
    },
    {
        time: '2.28',
        station: '武汉站',
        kind: '飞机',
        count: 20
    },
    {
        time: '2.29',
        station: '汉口站',
        kind: '火车',
        count: 10
    },
    {
        time: '2.29',
        station: '汉口站',
        kind: '飞机',
        count: 30
    },
    {
        time: '2.29',
        station: '武昌站',
        kind: '飞机',
        count: 60
    },
    {
        time: '2.29',
        station: '武昌站',
        kind: '火车',
        count: 10
    },
    {
        time: '2.29',
        station: '武昌站',
        kind: '火车',
        count: 30
    }
];

前端需求展示所需要的数据格式1

先根据时间筛选车站,然后根据车站计算当前的乘车方式还有多少票

[{
        time: '2.28',
        data:[{
            station:'武昌站',
            children:[{
                kind:'火车',
                count:30
            },{
                kind:'飞机',
                count:60
            }]
        },{
            station:'武汉站',
            children:[{
                kind:'火车',
                count:30
            },{
                kind:'飞机',
                count:60
            }]
        }]
    },
    {
        time: '2.29',
        data:[]
    }
];

具体代码如下

let newArr = arr.reduce((prev, item) => {
    //先根据时间进行分组,没有当前时间则添加到数组中
    let rst = prev.find(row => row.time == item.time);
    let obj = {
        station: item.station,
        children: [{
            kind: item.kind,
            count: item.count
        }]
    };
    if (!rst) {
        prev.push({
            time: item.time,
            data: [obj]
        });

    } else {
        // 已经存在了当前时间
        let station = rst.data.find(row => row.station == item.station);
        // 根据车站分组
        if (!station) {
            rst.data.push(obj);
        } else {
            // 根据票种进行分组
            let kind = station.children.find(row => row.kind == item.kind);
            if (!kind) {
                station.children.push({
                    kind: item.kind,
                    count: item.count
                });
            } else {
                kind.count += item.count;
            }
        }
    }
    return prev;
}, []);
console.log(newArr)

前端需求展示所需要的数据结构2

具体代码如下

let newArr = arr.reduce((prev, item) => {
  let time = prev.find(row => row.time == item.time);
  if (!time) {
    prev.push(item)
  } else {
    let station = prev.find(row => row.time == item.time && row.station == item.station);
    if (!station) {
      prev.push(item)
    } else {
      let kind = prev.find(row => row.time == item.time && row.station == item.station && row.kind == item.kind);
      if (!kind) {
        prev.push(item)
      } else {
        kind.count += item.count;
      }
    }
  }
  return prev;
}, [])
console.log(newArr)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

国产猛男

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值