【问题标题】:is there a better way to merge array of objects in Javascript? [closed]有没有更好的方法来合并 Javascript 中的对象数组? [关闭]
【发布时间】:2021-01-25 10:03:20
【问题描述】:

基本上,我想使用 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,
    }
  }
]

对我如何执行上述结果有什么建议吗?

【问题讨论】:

  • 请访问help center,使用tour查看内容和How to Ask。做一些研究,搜索关于 SO 的相关主题;如果您遇到困难,请发布您的尝试minimal reproducible example,并使用[<>] sn-p 编辑器记录输入和预期输出。
  • 你能分享一下你期望的输出吗?
  • 到目前为止你尝试过什么?您可以使用Array.prototype.reduce(),也可以以任何其他方式循环遍历数组项。
  • 顺便问一下,您能否确认您想要输出的是一组发票,而不是单个发票对象?
  • 要知道是否有更好的方法,我们首先需要知道您的当前方法

标签: javascript arrays object ecmascript-6


【解决方案1】:

我的方法

我将reduce 用于传入的数据数组,遍历数组中的每个项目并返回一个新数组。
在我的 reduce 函数中,我检查是否有当前 invoice_idclient_id 的项目。如果没有,我会创建它
然后我用item_idqtyprice 推送一个新项目

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2012-06-02
    相关资源
    最近更新 更多