繁体   English   中英

根据js中输入数组的日期创建不同的object

[英]Create distinct object based on the date from input array in js

我有一个如下所示的“订单”数组:

 [
   [
     ['2022-07-10', 300],
     ['2022-07-8', 350],
     ['2022-07-9', 400],
     ['2022-07-8', 206],
     ['2022-07-10', 300],
   ],
   [
     ['2022-07-7', 397],
     ['2022-07-9', 323],
     ['2022-07-8', 472],
     ['2022-07-7', 336],
     ['2022-07-10', 400],
   ],
 ];

最后我想要的是有一个包含不同日期的对象数组,并且总计是具有相同日期的元素的总和:

[
   {date: '10/07/2022', total: 1000},
   {date: '08/07/2022', total: 1028},
   {date: '09/07/2022', total: 723},
   ...
];

这是我所做的,我想知道是否有更好/更短的方法来做到这一点:

groupOrdersByDate(orders: any[]) {
    let res: any[] = [];

    orders.forEach((ar) => {
      ar.forEach((el: any) => {
        console.log(res);
        let dateOrder: string = new Date(el[0]).toLocaleDateString('fr');
        let found = res.some((e) => e.date === dateOrder);
        if (!found) {
          res.push({ date: dateOrder, total: el[1] });
        } else {
          let existingObj = res.find((el) => el.date === dateOrder);
          let indexx = res.findIndex((o) => {
            return o.date === existingObj.date;
          });
          existingObj.total = existingObj.total + el[1];
          res.splice(indexx, 1, existingObj);
        }
      });
    });
}

我还想知道为什么我的 res 数组的注释 console.log 不为空? 即使我还没有向它推送任何元素,它也会显示值?

如果将结果存储在中间 object 中会更高效/更简洁,因此您不必为每个元素find匹配项:

 const orders = [ [ ['2022-07-10', 300], ['2022-07-8', 350], ['2022-07-9', 400], ['2022-07-8', 206], ['2022-07-10', 300], ], [ ['2022-07-7', 397], ['2022-07-9', 323], ['2022-07-8', 472], ['2022-07-7', 336], ['2022-07-10', 400], ], ]; const _sum = {} orders.forEach(arr => { arr.forEach(([date, quantity]) => { let dateOrder = new Date(date).toLocaleDateString('fr'); _sum[dateOrder] = (_sum[dateOrder]?? 0) + quantity; }) }) let results = Object.entries(_sum).map(([date, total]) => ({date, total})) console.log(results)

暂无
暂无

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

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