javascript - 数组如何在java脚本中分组
问题描述
嗨,我是 java 脚本的新手,我正在使用 knex ORM 与数据库进行交互,我得到了平缓的 json 作为结果行,我需要以我在预期结果中提到的实际格式获得结果。我尝试了一些代码,但没有一个代码给我预期的结果。我已经提到了我尝试过的原型代码以及代码的结果,它不是我想要的格式我怎样才能获得我在预期结果部分中提到的实际结果,我如何使用 lodash 或 ES6 来实现相同的结果高阶函数。
var data= [
{order_id: 1,kot_id: 10,price: 20,quantity: 2},
{order_id: 1,kot_id: 10,price: 100,quantity: 1},
{order_id: 1,kot_id: 10,price: 150,quantity: 1},
{order_id: 1,kot_id: 11,price: 55,quantity: 1},
{order_id: 1,kot_id: 11,price: 250,quantity: 3},
]
let objects = {}
let arr = []
result = data.forEach((item,index) => {
if(!objects.order_id) {
objects = {order_id: item.order_id,list: []}
arr.push(objects)
}
if(!objects.kot_id) {
objects.list.push({kot_id: item.kot_id,kot_list: []})
}
objects.list[index].kot_list.push({price: item.price,quantity: item.quantity})
})
console.log(JSON.stringify(arr,null,2))
RESULT OF THE ABOVE CODE
[
{
"order_id": 1,
"list": [
{
"kot_id": 10,
"kot_list": [
{
"price": 20,
"quantity": 2
}
]
},
{
"kot_id": 10,
"kot_list": [
{
"price": 100,
"quantity": 1
}
]
},
{
"kot_id": 10,
"kot_list": [
{
"price": 150,
"quantity": 1
}
]
},
{
"kot_id": 11,
"kot_list": [
{
"price": 55,
"quantity": 1
}
]
},
{
"kot_id": 11,
"kot_list": [
{
"price": 250,
"quantity": 3
},
]
}
]
}
]
EXPECTED RESULT
result = [
{
order_id: 1,
list: [
{
kot_id: 10,
kot_list : [
{ price: 200,quantity: 2 },
{price: 100,quantity: 1},
{price: 150,quantity: 1}
]
},
{
kot_id: 11,
kot_list: [
{price: 55,quantity: 1},
{price: 250,quantity: 3}
]
}
]
}
]
解决方案
像groupBy和mapValues这样的lodash实用程序应该可以完成这项工作。
洛达什示例:
const data = [
{order_id: 1, kot_id: 10, price: 20, quantity: 2},
{order_id: 1, kot_id: 10, price: 100, quantity: 1},
{order_id: 1, kot_id: 10, price: 150, quantity: 1},
{order_id: 1, kot_id: 11, price: 55, quantity: 1},
{order_id: 1, kot_id: 11, price: 250, quantity: 3},
{order_id: 2, kot_id: 10, price: 150, quantity: 1},
{order_id: 2, kot_id: 11, price: 55, quantity: 1},
{order_id: 2, kot_id: 11, price: 250, quantity: 3},
]
const result = _(data)
.groupBy('order_id')
.mapValues((values, key) => {
return _(values)
.groupBy('kot_id')
.map((list, id) => ({
kot_id: id,
kot_list: _.map(list, i => _.pick(i, ['price', 'quantity']))
}))
.value();
})
.map((list, order_id) => ({order_id, list}))
.value();
console.log(JSON.stringify(result, null, 4));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
或者您可以简单地使用 ES6 实用程序来实现相同的结果:
简单的 ES6 示例:
const data = [
{order_id: 1, kot_id: 10, price: 20, quantity: 2},
{order_id: 1, kot_id: 10, price: 100, quantity: 1},
{order_id: 1, kot_id: 10, price: 150, quantity: 1},
{order_id: 1, kot_id: 11, price: 55, quantity: 1},
{order_id: 1, kot_id: 11, price: 250, quantity: 3},
{order_id: 2, kot_id: 10, price: 150, quantity: 1},
{order_id: 2, kot_id: 11, price: 55, quantity: 1},
{order_id: 2, kot_id: 11, price: 250, quantity: 3},
]
const orderIds = [...new Set(data.map(i => i.order_id))];
const kotIds = [... new Set(data.map(i => i.kot_id))];
const result = orderIds.map(order_id => {
return {
order_id,
list: kotIds
.map(kot_id => {
return {
kot_id,
kot_list: data
.filter(i => i.order_id === order_id && i.kot_id === kot_id)
.map(i => ({price: i.price, quantity: i.quantity}))
}
})
};
});
console.log(JSON.stringify(result, null, 4));
推荐阅读
- rake - 从 IMAP、Redmine OpenProject 接收电子邮件
- powershell - 活动监视器总数
- apache-spark - 在本地模式下,Spark 上的 CPU 使用率非常低且执行速度慢
- c++ - 模板化的 constexpr 变量
- python - 如何在一张图中绘制多个时间线?
- php - 获取多维数组的最接近的较小数组键
- assembly - 迭代 MIPS 中的链表
- python - macOS 上 libmsodbcsql.17.dylib 的错误“找不到文件”错误
- javascript - 这是什么日期时间格式以及如何使用本机浏览器日期函数转换它?
- flutter - 脚手架在颤动