首页 > 解决方案 > 有没有更好的方法来合并 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,
    }
  }
]

关于如何执行上述结果的任何建议?

标签: javascriptarraysobjectecmascript-6

解决方案


我的方法

我对传入的数据数组使用reduce,遍历数组中的每个项目并返回一个新数组。
在我的 reduce 函数中,我检查是否有一个带有当前invoice_idand的项目client_id。如果没有,我将创建它
然后我用item_id,qtyprice

{
  "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)
}


推荐阅读