首页 > Java > java教程 > 正文

合并数组中基于键值的对象

DDD
发布: 2025-10-19 12:12:01
原创
784人浏览过

合并数组中基于键值的对象

本文旨在提供一种解决方案,用于合并数组中具有相同键值的对象。通过使用 groupBy 和 flatMap 等函数,我们可以将具有相同 categoryId 的对象合并成一个对象,并将它们的 addons 列表合并成一个单一的列表。文章将提供详细的代码示例,帮助读者理解和实现这一过程。

假设我们有一个包含多个对象的数组,每个对象都包含一个 categoryId 和一个 addons 列表。我们的目标是将具有相同 categoryId 的对象合并成一个对象,并将它们的 addons 列表合并成一个单一的列表。

例如,我们有以下数组:

[
  {
    "addons": [
      {
        "addonId": "Addon_5035fac357f446fb8b4fcff45d2e36e5",
        "addonIdentifier": "Gherkin",
        "addonQuantity": 1,
        "subTotal": 0.99,
        "addonType": "EXTRAS"
      }
    ],
    "categoryId": "Addon_Cate_1a7bacd1a07b40ceb7d5d3a2229fb303",
    "categoryIdentifier": "Extra 1"
  },
  {
    "addons": [
      {
        "addonId": "Addon_700a1458fae54ba9b3e148da709eea4a",
        "addonIdentifier": "Hash Brown",
        "addonQuantity": 1,
        "subTotal": 0.99,
        "addonType": "EXTRAS"
      }
    ],
    "categoryId": "Addon_Cate_1a7bacd1a07b40ceb7d5d3a2229fb303",
    "categoryIdentifier": "Extra 1"
  },
  {
    "addons": [
      {
        "addonId": "Addon_f4408295adb14723aa22a3a7e645a7a7",
        "addonIdentifier": "Cheese",
        "addonQuantity": 1,
        "subTotal": 0.99,
        "addonType": "EXTRAS"
      }
    ],
    "categoryId": "Addon_Cate_1a7bacd1a07b40ceb7d5d3a2229fb303",
    "categoryIdentifier": "Extra 1"
  }
]
登录后复制

我们希望将其转换为以下格式:

[
  {
    "addons": [
      {
        "addonId": "Addon_5035fac357f446fb8b4fcff45d2e36e5",
        "addonIdentifier": "Gherkin",
        "addonQuantity": 1,
        "subTotal": 0.99,
        "addonType": "EXTRAS"
      },
      {
        "addonId": "Addon_700a1458fae54ba9b3e148da709eea4a",
        "addonIdentifier": "Hash Brown",
        "addonQuantity": 1,
        "subTotal": 0.99,
        "addonType": "EXTRAS"
      },
      {
        "addonId": "Addon_f4408295adb14723aa22a3a7e645a7a7",
        "addonIdentifier": "Cheese",
        "addonQuantity": 1,
        "subTotal": 0.99,
        "addonType": "EXTRAS"
      }
    ],
    "categoryId": "Addon_Cate_1a7bacd1a07b40ceb7d5d3a2229fb303",
    "categoryIdentifier": "Extra 1"
  }
]
登录后复制

以下是一些实现此目标的示例代码:

方法一:使用 groupBy 和 mapValues

此方法首先使用 groupBy 函数按 categoryId 对对象进行分组,然后使用 mapValues 函数将每个组中的 addons 列表合并成一个单一的列表。

data class Item(
    val addons: List<Addon>,
    val categoryId: String,
    val categoryIdentifier: String
)

data class Addon(
    val addonId: String,
    val addonIdentifier: String,
    val addonQuantity: Int,
    val subTotal: Double,
    val addonType: String
)

fun mergeItems(items: List<Item>): Map<String, List<Addon>> {
    return items.groupBy({ it.categoryId }, { it.addons })
        .mapValues { (_, addonLists) -> addonLists.flatten() }
}

// 示例用法
fun main() {
    val items = listOf(
        Item(listOf(Addon("Addon_5035fac357f446fb8b4fcff45d2e36e5", "Gherkin", 1, 0.99, "EXTRAS")), "Addon_Cate_1a7bacd1a07b40ceb7d5d3a2229fb303", "Extra 1"),
        Item(listOf(Addon("Addon_700a1458fae54ba9b3e148da709eea4a", "Hash Brown", 1, 0.99, "EXTRAS")), "Addon_Cate_1a7bacd1a07b40ceb7d5d3a2229fb303", "Extra 1"),
        Item(listOf(Addon("Addon_f4408295adb14723aa22a3a7e645a7a7", "Cheese", 1, 0.99, "EXTRAS")), "Addon_Cate_1a7bacd1a07b40ceb7d5d3a2229fb303", "Extra 1")
    )

    val mergedItems = mergeItems(items)
    println(mergedItems)
}
登录后复制

方法二:使用 flatMap 和 groupBy

EasyUI中文学习教程 DOC版
EasyUI中文学习教程 DOC版

jQuery EasyUI是一组基于jQuery的UI插件集合体,而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面。开发者不需要编写复杂的javascript,也不需要对css样式有深入的了解,开发者需要了解的只有一些简单的html标签。本平台提供EasyUI中文学习教程下载,需要的朋友们可以下载!

EasyUI中文学习教程 DOC版 0
查看详情 EasyUI中文学习教程 DOC版

此方法首先使用 flatMap 函数将每个 Item 对象转换为一个 (categoryId, Addon) 对的列表,然后使用 groupBy 函数按 categoryId 对这些对进行分组。

fun mergeItems2(items: List<Item>): Map<String, List<Addon>> {
    return items.flatMap { item ->
        item.addons.map { addon -> item.categoryId to addon }
    }.groupBy({ it.first }, { it.second })
}

// 示例用法
fun main() {
    val items = listOf(
        Item(listOf(Addon("Addon_5035fac357f446fb8b4fcff45d2e36e5", "Gherkin", 1, 0.99, "EXTRAS")), "Addon_Cate_1a7bacd1a07b40ceb7d5d3a2229fb303", "Extra 1"),
        Item(listOf(Addon("Addon_700a1458fae54ba9b3e148da709eea4a", "Hash Brown", 1, 0.99, "EXTRAS")), "Addon_Cate_1a7bacd1a07b40ceb7d5d3a2229fb303", "Extra 1"),
        Item(listOf(Addon("Addon_f4408295adb14723aa22a3a7e645a7a7", "Cheese", 1, 0.99, "EXTRAS")), "Addon_Cate_1a7bacd1a07b40ceb7d5d3a2229fb303", "Extra 1")
    )

    val mergedItems = mergeItems2(items)
    println(mergedItems)
}
登录后复制

方法三:使用 fold 和 mutableMapOf

此方法使用 fold 函数创建一个可变映射,并将具有相同 categoryId 的 addons 列表添加到该映射中。

fun mergeItems3(items: List<Item>): MutableMap<String, MutableList<Addon>> {
    return items.fold(mutableMapOf<String, MutableList<Addon>>()) { groups, item ->
        groups.apply {
            getOrPut(item.categoryId) { mutableListOf() }
            .addAll(item.addons)
        }
    }
}

// 示例用法
fun main() {
    val items = listOf(
        Item(listOf(Addon("Addon_5035fac357f446fb8b4fcff45d2e36e5", "Gherkin", 1, 0.99, "EXTRAS")), "Addon_Cate_1a7bacd1a07b40ceb7d5d3a2229fb303", "Extra 1"),
        Item(listOf(Addon("Addon_700a1458fae54ba9b3e148da709eea4a", "Hash Brown", 1, 0.99, "EXTRAS")), "Addon_Cate_1a7bacd1a07b40ceb7d5d3a2229fb303", "Extra 1"),
        Item(listOf(Addon("Addon_f4408295adb14723aa22a3a7e645a7a7", "Cheese", 1, 0.99, "EXTRAS")), "Addon_Cate_1a7bacd1a07b40ceb7d5d3a2229fb303", "Extra 1")
    )

    val mergedItems = mergeItems3(items)
    println(mergedItems)
}
登录后复制

注意事项

  • 以上代码示例使用了 Kotlin 语言。
  • 这些方法假设 categoryId 是用于合并对象的唯一键。如果需要使用多个键进行合并,则需要修改代码。
  • 这些方法返回的是不可变集合。如果需要返回可变集合,则需要使用 toMutableList() 或 toMutableMap() 函数。

总结

本文提供了一种解决方案,用于合并数组中具有相同键值的对象。通过使用 groupBy 和 flatMap 等函数,我们可以将具有相同 categoryId 的对象合并成一个对象,并将它们的 addons 列表合并成一个单一的列表。希望这些代码示例能够帮助读者理解和实现这一过程。

以上就是合并数组中基于键值的对象的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号