过滤嵌套的对象数组并使用 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);
我有如下对象数组:
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);