过滤嵌套的对象数组并使用 reduce 获得总数

Filter nested array of objects and get total with reduce

我有如下对象数组:

     const data = [
     {
        "order_id":38795,
        "order_type":"Music",
        "date":"2021-08-14",
        "name":"Concert",
        "tickets":[
           {
              "id":9,
              "ticket_type":"Priority",
              "quantity":2,
              "price":25,
              "detail":{
                 "Adults":1,
                 "Children":0,
              }
           },
           {
              "id":10,
              "ticket_type":"Priority",
              "quantity":1,
              "price":10,
              "detail":{
                 "Adults":0,
                 "Children":1,
              }
           },
           {
              "id":10,
              "ticket_type":"Standard",
              "quantity":3,
              "price":15,
              "detail":{
                 "Adults":1,
                 "Children":0,
              }
           }
        ]
     },
     {
        "order_id":84874,
        "order_type":"Film",
        "date":"2021-08-14",
        "name":"Adventure",
        "tickets":[
           {
              "id":7,
              "ticket_type":"Standard",
              "quantity":1,
              "price":20,
              "detail":{
                 "Adults":1,
                 "Children":0,
              }
           }
        ]
     }
  ];

我需要能够获得音乐成人票的总数 order_types。

在这种情况下,答案是 5(2 * 成人优先和 3 * 成人标准)

我已开始使用数组 filter 创建一个仅包含 'Music' order_type

的新数组
const musicOrders = data.filter((order) => {
    return order.order_type == 'Music'
});

关于添加数量字段,我认为数组reduce会循环乘以数量。

.reduce((total, ticket) => {
    return total + ticket.quantity;
}, 0)

但我不确定如何先将 data 数组过滤为

order_type = "Music"
ticket.detail.Adults = 1 / true

然后在一个函数中获取数量?

您可以按如下方式使用函数Array.prototype.reduce

顶层 reduce 调用检查具有 order_type == 'Music' 的对象,嵌套 reduce 调用在 attr Adults > 0.

时计算数量

const data = [     {        "order_id":38795,        "order_type":"Music",        "date":"2021-08-14",        "name":"Concert",        "tickets":[           {              "id":9,              "ticket_type":"Priority",              "quantity":2,              "price":25,              "detail":{                 "Adults":1,                 "Children":0,              }           },           {              "id":10,              "ticket_type":"Priority",              "quantity":1,              "price":10,              "detail":{                 "Adults":0,                 "Children":1,              }           },           {              "id":10,              "ticket_type":"Standard",              "quantity":3,              "price":15,              "detail":{                 "Adults":1,                 "Children":0,              }           }        ]     },     {        "order_id":84874,        "order_type":"Film",        "date":"2021-08-14",        "name":"Adventure",        "tickets":[           {              "id":7,              "ticket_type":"Standard",              "quantity":1,              "price":20,              "detail":{                 "Adults":1,                 "Children":0,              }           }        ]     }  ],
      countQty = (at, {quantity, detail: {Adults}}) => at + (Adults > 0 ? quantity : 0),
      result = data.reduce((a, {tickets, order_type}) => {
         return a + (order_type == "Music" ? tickets.reduce(countQty, 0) : 0);
      }, 0);
  
console.log(result);

这是我使用双 Array.prototype.reduce() 的看法,这将满足您只需调用一个(父)函数的条件。

恐怕真的不可能只使用一个函数来做到这一点,因为有嵌套的(=多个)数组需要迭代。

const data= [{order_id:38795,order_type:"Music",date:"2021-08-14",name:"Concert",tickets:[{id:9,ticket_type:"Priority",quantity:2,price:25,detail:{Adults:1,Children:0,},},{id:10,ticket_type:"Priority",quantity:1,price:10,detail:{Adults:0,Children:1,},},{id:10,ticket_type:"Standard",quantity:3,price:15,detail:{Adults:1,Children:0,},},],},{order_id:84874,order_type:"Film",date:"2021-08-14",name:"Adventure",tickets:[{id:7,ticket_type:"Standard",quantity:1,price:20,detail:{Adults:1,Children:0,}}]}];

const result = data.reduce(
  (acc, curr) =>
  (acc +=
    curr.order_type === "Music" &&
    curr.tickets.reduce(
      (acc, curr) => acc + curr.detail.Adults * curr.quantity,
      0
    )),
  0
);

console.log(result);

您可以使用 Array.prototype.find() 搜索“音乐”。
然后 Array.prototype.reduce() 像这样:

const data = [
     {
        "order_id":38795,
        "order_type":"Music",
        "date":"2021-08-14",
        "name":"Concert",
        "tickets":[
           {
              "id":9,
              "ticket_type":"Priority",
              "quantity":2,
              "price":25,
              "detail":{
                 "Adults":1,
                 "Children":0,
              }
           },
           {
              "id":10,
              "ticket_type":"Priority",
              "quantity":1,
              "price":10,
              "detail":{
                 "Adults":0,
                 "Children":1,
              }
           },
           {
              "id":10,
              "ticket_type":"Standard",
              "quantity":3,
              "price":15,
              "detail":{
                 "Adults":1,
                 "Children":0,
              }
           }
        ]
     },
     {
        "order_id":84874,
        "order_type":"Film",
        "date":"2021-08-14",
        "name":"Adventure",
        "tickets":[
           {
              "id":7,
              "ticket_type":"Standard",
              "quantity":1,
              "price":20,
              "detail":{
                 "Adults":1,
                 "Children":0,
              }
           }
        ]
     }
  ];

  
  const res = data.find(item => item.order_type === 'Music').tickets.reduce((acc, curr) => {
    acc += curr.quantity * curr.detail.Adults;
    return acc;
  }, 0);

  console.log(res);