【问题标题】:Combine JSON Arrays with same Key Value组合具有相同键值的 JSON 数组
【发布时间】:2021-06-21 20:51:34
【问题描述】:

我正在尝试为 OrderLines 数组中的同一 ID 字段组合“scheduleDetails”数组

我尝试使用 Groovy 并获得了结果,但其中一个数组正在重复,我仍在进行故障排除。我想探索使用 Javascript 是否更容易。

输入:

{
    "orderLines": [{
        "ID": "001",
        "orderedArticle" : {
            "scheduleDetails": [{
                "address": {
                    "street": [
                        "1234 Unknown blvd001-1"
                    ],
                    "city": "unknown001-1"
                }
            }]
        }
    },
    {
        "ID": "003",
        "orderedArticle" : {
            "scheduleDetails": [{
                "address": {
                    "street": [
                        "1234 Unknown blvd003-1"
                    ],
                    "city": "unknown003-1"
                }
            }]
        }
    },
    {
        "ID": "001",
        "orderedArticle" : {
            "scheduleDetails": [{
                "address": {
                    "street": [
                        "1234 Unknown blvd001-2"
                    ],
                    "city": "unknown001-2"
                }
            }]
        }
    },
    {
        "ID": "002",
        "orderedArticle" : {
            "scheduleDetails": [{
                "address": {
                    "street": [
                        "1234 Unknown blvd002-1"
                    ],
                    "city": "unknown002-1"
                }
            }]
        }
    },
    {
        "ID": "003",
        "orderedArticle" : {
            "scheduleDetails": [{
                "address": {
                    "street": [
                        "1234 Unknown blvd003-2"
                    ],
                    "city": "unknown003-2"
                }
            }]
        }
    }]
}

输出:

{
    "orderLines": [{
        "ID": "001",
        "orderedArticle": {
            "scheduleDetails": [{
                "address": {
                    "street": [
                        "1234 Unknown blvd001-1"
                    ],
                    "city": "unknown001-1"
                }
            },
            {
                "address": {
                    "street": [
                        "1234 Unknown blvd001-2"
                    ],
                    "city": "unknown001-2"
                }
            }]
        }
    },
    {
        "ID": "003",
        "orderedArticle": {
            "scheduleDetails": [{
                "address": {
                    "street": [
                        "1234 Unknown blvd003-1"
                    ],
                    "city": "unknown003-1"
                }
            },
            {
                "address": {
                    "street": [
                        "1234 Unknown blvd003-2"
                    ],
                    "city": "unknown003-2"
                }
            }]
        }
    },
    {
        "ID": "002",
        "orderedArticle": {
            "scheduleDetails": [{
                "address": {
                    "street": [
                        "1234 Unknown blvd002-1"
                    ],
                    "city": "unknown002-1"
                }
            }]
        }
    }]
}

非常感谢任何帮助!蒂亚!!

【问题讨论】:

标签: javascript arrays json


【解决方案1】:

您可以在Object.values() 之后使用Array.prototype.reduce() 来实现此目的:

const oldOrderLinesObj = {
  "orderLines": [{
      "ID": "001",
      "orderedArticle" : {
          "scheduleDetails": [{
              "address": {
                  "street": [
                      "1234 Unknown blvd001-1"
                  ],
                  "city": "unknown001-1"
              }
          }]
      }
  },
  {
      "ID": "003",
      "orderedArticle" : {
          "scheduleDetails": [{
              "address": {
                  "street": [
                      "1234 Unknown blvd003-1"
                  ],
                  "city": "unknown003-1"
              }
          }]
      }
  },
  {
      "ID": "001",
      "orderedArticle" : {
          "scheduleDetails": [{
              "address": {
                  "street": [
                      "1234 Unknown blvd001-2"
                  ],
                  "city": "unknown001-2"
              }
          }]
      }
  },
  {
      "ID": "002",
      "orderedArticle" : {
          "scheduleDetails": [{
              "address": {
                  "street": [
                      "1234 Unknown blvd002-1"
                  ],
                  "city": "unknown002-1"
              }
          }]
      }
  },
  {
      "ID": "003",
      "orderedArticle" : {
          "scheduleDetails": [{
              "address": {
                  "street": [
                      "1234 Unknown blvd003-2"
                  ],
                  "city": "unknown003-2"
              }
          }]
      }
  }]
}

const newOrderLinesObj = {orderLines: Object.values(oldOrderLinesObj.orderLines.reduce((acc, curr) => {
  if(!acc[curr.ID]) {
    acc[curr.ID] = curr
  } else {
    acc[curr.ID].orderedArticle.scheduleDetails.push(...curr.orderedArticle.scheduleDetails)
  }

  return acc;
}, {}))}

console.log(newOrderLinesObj);

这是sandBox

【讨论】:

  • 您的代码有效,但所有数据均从 dataContext 对象引用,该对象包含以下方法:getDataCount() - 获取正在处理的文档数。 getStream(int) - 获取给定文档索引的 InputStream。 getProperties(int) - 获取给定文档索引的 Properties 对象。 storeStream(InputStream, Properties) - 将位于 InputStream 中的数据与任何 Properties 一起存储回进程。数据应由 getStream(int) 方法获取、操作,然后使用 storeStream(InputStream, Properties) 存储回 dataContext )
  • 什么是storeStream()?它来自第 3 方库?
【解决方案2】:

您可以使用一个集合,并在再次找到现有 ID 时合并

例如

let input = {
  "orderLines": [{
      "ID": "001",
      "orderedArticle": {
        "scheduleDetails": [{
          "address": {
            "street": [
              "1234 Unknown blvd001-1"
            ],
            "city": "unknown001-1"
          }
        }]
      }
    },
    {
      "ID": "003",
      "orderedArticle": {
        "scheduleDetails": [{
          "address": {
            "street": [
              "1234 Unknown blvd003-1"
            ],
            "city": "unknown003-1"
          }
        }]
      }
    },
    {
      "ID": "001",
      "orderedArticle": {
        "scheduleDetails": [{
          "address": {
            "street": [
              "1234 Unknown blvd001-2"
            ],
            "city": "unknown001-2"
          }
        }]
      }
    },
    {
      "ID": "002",
      "orderedArticle": {
        "scheduleDetails": [{
          "address": {
            "street": [
              "1234 Unknown blvd002-1"
            ],
            "city": "unknown002-1"
          }
        }]
      }
    },
    {
      "ID": "003",
      "orderedArticle": {
        "scheduleDetails": [{
          "address": {
            "street": [
              "1234 Unknown blvd003-2"
            ],
            "city": "unknown003-2"
          }
        }]
      }
    }
  ]
};

let output = {
  "orderLines": []
};
let processed = new Set();

input.orderLines.forEach(inOrderLine => {
  if (!processed.has(inOrderLine.ID)) {
    processed.add(inOrderLine.ID);
    output.orderLines.push(inOrderLine);
  } else {
    let matched = output.orderLines.find(
      outOrderLine => outOrderLine.ID == inOrderLine.ID
    ).orderedArticle.scheduleDetails.push(
      inOrderLine.orderedArticle.scheduleDetails[0]
    );
  }
})

console.log(output);

【讨论】:

  • 您的代码有效,但所有数据均从 dataContext 对象引用,该对象包含以下方法:getDataCount() - 获取正在处理的文档数。 getStream(int) - 获取给定文档索引的 InputStream。 getProperties(int) - 获取给定文档索引的 Properties 对象。 storeStream(InputStream, Properties) - 将位于 InputStream 中的数据与任何 Properties 一起存储回进程。数据应由 getStream(int) 方法获取、操作,然后使用 storeStream(InputStream, Properties) 存储回 dataContext )
猜你喜欢
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 2018-02-23
  • 2020-12-29
  • 2014-03-12
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
相关资源
最近更新 更多