JavaScript 数组:按 2 组查询数组:卡在 reduce() javascript 问题中
JavaScript Array: Query an array by 2 grouping: stuck in a reduce() javascript problem
我对 reduce() 函数有疑问。
假设我有这个数组:
myOrders =
[ { order_date: '2019/12/01', order_type: 'Shoes', order_amount: 50 }
, { order_date: '2019/12/01', order_type: 'Shoes', order_amount: 30 }
, { order_date: '2019/12/01', order_type: 'Shirts', order_amount: 30 }
, { order_date: '2019/12/02', order_type: 'Shoes', order_amount: 10 }
]
我需要想出如下内容:
filteredOrders = [
{
order_date: '2019/12/01',
ordered_items: {
{type: 'Shoes', amount: 80},
{type: 'Shirts', amount: 30}
}
}
]
请注意,此过滤后的数组正在查询 date
并通过 type
对 amount
求和。
我有下面的一段代码,但我无法让它工作,同时考虑到 type
let seriesData = Object.entries(
buyOperations.reduce(
(dvs, { order_date: d, order_amount: v }) =>
({ ...dvs, [d]: (dvs[d] || 0) + v }), {}
)
).map(([order_date, order_amount]) => ({
order_date,
order_amount
}));
你可以使用reduce
方法按order_date
分组,然后你可以根据order_type
是否已经被推送来对你的元素求和:
myOrders.reduce((a, {order_date, order_type,order_amount})=> {
a[order_date] = a[order_date] || {order_date, ordered_items: []};
let order_items = a[order_date].ordered_items.find(s => s.type == order_type);
if (order_items)
order_items.amount +=order_amount;
else
a[order_date].ordered_items.push({type: order_type, amount: order_amount});
return a;
}, {})
一个例子:
let myOrders = [
{
order_date: '2019/12/01',
order_type: 'Shoes',
order_amount: 50
},
{
order_date: '2019/12/01',
order_type: 'Shoes',
order_amount: 30
},
{
order_date: '2019/12/01',
order_type: 'Shirts',
order_amount: 30
},
{
order_date: '2019/12/02',
order_type: 'Shoes',
order_amount: 10
}
];
const result = myOrders.reduce((a, {order_date, order_type,order_amount})=> {
a[order_date] = a[order_date] || {order_date, ordered_items: []};
let order_items = a[order_date].ordered_items.find(s => s.type == order_type);
if (order_items)
order_items.amount +=order_amount;
else
a[order_date].ordered_items.push({type: order_type, amount: order_amount});
return a;
}, {})
console.log(`filtered array: `, Object.values(result).filter(f => f.order_date == '2019/12/01'));
console.log(`overall array: `, Object.values(result));
您需要按 dae 和类型进行嵌套分组。此方法对数据使用单个循环,并使用 Array#find
获取相同的组。如果没有找到一个新组插入到同一级别。
var orders = [{ order_date: '2019/12/01', order_type: 'Shoes', order_amount: 50 }, { order_date: '2019/12/01', order_type: 'Shoes', order_amount: 30 }, { order_date: '2019/12/01', order_type: 'Shirts', order_amount: 30 }, { order_date: '2019/12/02', order_type: 'Shoes', order_amount: 10 }],
grouped = orders.reduce((r, { order_date, order_type, order_amount }) => {
var date = r.find(q => q.order_date === order_date);
if (!date) r.push(date = { order_date, ordered_items: [] });
var type = date.ordered_items.find(q => q.order_type === order_type);
if (!type) date.ordered_items.push(type = { order_type, order_amount: 0 });
type.order_amount += order_amount;
return r;
}, []);
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
我对 reduce() 函数有疑问。
假设我有这个数组:
myOrders =
[ { order_date: '2019/12/01', order_type: 'Shoes', order_amount: 50 }
, { order_date: '2019/12/01', order_type: 'Shoes', order_amount: 30 }
, { order_date: '2019/12/01', order_type: 'Shirts', order_amount: 30 }
, { order_date: '2019/12/02', order_type: 'Shoes', order_amount: 10 }
]
我需要想出如下内容:
filteredOrders = [
{
order_date: '2019/12/01',
ordered_items: {
{type: 'Shoes', amount: 80},
{type: 'Shirts', amount: 30}
}
}
]
请注意,此过滤后的数组正在查询 date
并通过 type
对 amount
求和。
我有下面的一段代码,但我无法让它工作,同时考虑到 type
let seriesData = Object.entries(
buyOperations.reduce(
(dvs, { order_date: d, order_amount: v }) =>
({ ...dvs, [d]: (dvs[d] || 0) + v }), {}
)
).map(([order_date, order_amount]) => ({
order_date,
order_amount
}));
你可以使用reduce
方法按order_date
分组,然后你可以根据order_type
是否已经被推送来对你的元素求和:
myOrders.reduce((a, {order_date, order_type,order_amount})=> {
a[order_date] = a[order_date] || {order_date, ordered_items: []};
let order_items = a[order_date].ordered_items.find(s => s.type == order_type);
if (order_items)
order_items.amount +=order_amount;
else
a[order_date].ordered_items.push({type: order_type, amount: order_amount});
return a;
}, {})
一个例子:
let myOrders = [
{
order_date: '2019/12/01',
order_type: 'Shoes',
order_amount: 50
},
{
order_date: '2019/12/01',
order_type: 'Shoes',
order_amount: 30
},
{
order_date: '2019/12/01',
order_type: 'Shirts',
order_amount: 30
},
{
order_date: '2019/12/02',
order_type: 'Shoes',
order_amount: 10
}
];
const result = myOrders.reduce((a, {order_date, order_type,order_amount})=> {
a[order_date] = a[order_date] || {order_date, ordered_items: []};
let order_items = a[order_date].ordered_items.find(s => s.type == order_type);
if (order_items)
order_items.amount +=order_amount;
else
a[order_date].ordered_items.push({type: order_type, amount: order_amount});
return a;
}, {})
console.log(`filtered array: `, Object.values(result).filter(f => f.order_date == '2019/12/01'));
console.log(`overall array: `, Object.values(result));
您需要按 dae 和类型进行嵌套分组。此方法对数据使用单个循环,并使用 Array#find
获取相同的组。如果没有找到一个新组插入到同一级别。
var orders = [{ order_date: '2019/12/01', order_type: 'Shoes', order_amount: 50 }, { order_date: '2019/12/01', order_type: 'Shoes', order_amount: 30 }, { order_date: '2019/12/01', order_type: 'Shirts', order_amount: 30 }, { order_date: '2019/12/02', order_type: 'Shoes', order_amount: 10 }],
grouped = orders.reduce((r, { order_date, order_type, order_amount }) => {
var date = r.find(q => q.order_date === order_date);
if (!date) r.push(date = { order_date, ordered_items: [] });
var type = date.ordered_items.find(q => q.order_type === order_type);
if (!type) date.ordered_items.push(type = { order_type, order_amount: 0 });
type.order_amount += order_amount;
return r;
}, []);
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }