
本文旨在提供一种解决方案,用于合并数组中具有相同键值的对象。通过使用 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
jQuery EasyUI是一组基于jQuery的UI插件集合体,而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面。开发者不需要编写复杂的javascript,也不需要对css样式有深入的了解,开发者需要了解的只有一些简单的html标签。本平台提供EasyUI中文学习教程下载,需要的朋友们可以下载!
0
此方法首先使用 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)
}注意事项
总结
本文提供了一种解决方案,用于合并数组中具有相同键值的对象。通过使用 groupBy 和 flatMap 等函数,我们可以将具有相同 categoryId 的对象合并成一个对象,并将它们的 addons 列表合并成一个单一的列表。希望这些代码示例能够帮助读者理解和实现这一过程。
以上就是合并数组中基于键值的对象的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号