javascript - 有没有更好的方法来合并 Javascript 中的对象数组?
问题描述
基本上,我想使用Javascript或其任何npm 模块将我从数据库查询的结果格式化为一个新对象。
我有来自数据库的以下对象数组:
[
{
"invoice_id": 1,
"item_id": 23,
"client_id": 2,
"price": 3000.00,
"qty": 4
},
{
"invoice_id": 1,
"item_id": 45,
"client_id": 2,
"price": 8000.00,
"qty": 1
},
{
"invoice_id": 1,
"item_id": 56,
"client_id": 2,
"price": 10000.00,
"qty": 1
},
],
我想按以下格式合并上述对象:
[
{
"invoice": {
"invoice_id": 1,
"items": [
{
"item_id": 23,
"price": 3000.00,
"qty": 4
},
{
"item_id": 45,
"price": 8000.00,
"qty": 1
},
{
"item_id": 56,
"price": 10000.00,
"qty": 1
}
],
},
"client": {
"client_id": 2,
}
}
]
关于如何执行上述结果的任何建议?
解决方案
我的方法
我对传入的数据数组使用reduce,遍历数组中的每个项目并返回一个新数组。
在我的 reduce 函数中,我检查是否有一个带有当前invoice_id
and的项目client_id
。如果没有,我将创建它
然后我用item_id
,qty
和price
{
"use strict";
const data = [
{
"invoice_id": 1,
"item_id": 23,
"client_id": 2,
"price": 3000.00,
"qty": 4
},
{
"invoice_id": 1,
"item_id": 45,
"client_id": 2,
"price": 8000.00,
"qty": 1
},
{
"invoice_id": 1,
"item_id": 56,
"client_id": 2,
"price": 10000.00,
"qty": 1
},
]
const parsedData = data.reduce((carry, item) => {
let temp = carry.find(e => e.invoice?.invoice_id == item.invoice_id && e.client?.client_id == item.client_id);
if (temp === undefined) {
temp = carry[carry.push({}) - 1]
temp.invoice = {invoice_id: item.invoice_id, items: []}
temp.client = {client_id: item.client_id}
}
temp.invoice.items.push({item_id: item.item_id, price: item.price, qty: item.qty})
return carry
}, [])
console.log(parsedData)
}
推荐阅读
- flutter - 找不到有关如何在自定义小部件中使用 ListView 的正确布局选项
- reactjs - React 组件的 TypeScript 类型,其中 prop 是对象数组?
- azure - 用于分析服务和 Power BI 的 Azure AD B2B - 外部用户邀请
- python - 来自API的NoneType?
- xml - 缩小时如何更改提示的大小?
- javascript - 无法在第二个文本框中输入值
- swift - 无论我使用什么类型,都会出现“类型不匹配”
- javascript - 在数据范围内未找到日期
- django - Django geoip2 + Maxmind 在本地工作,但不在生产中?
- plot - Netlogo 如何制作有序直方图