【问题标题】:how can I count total number of keyValues in array of object如何计算对象数组中的键值总数
【发布时间】:2018-11-01 08:05:06
【问题描述】:

我得到了 CartDataModal 结构中的字典数组

class CartDataModal: NSObject {
    static let shared_Inst = CartDataModal()
    var cartArrayDict = [[String:Any]]()
}

接收到的数据格式如下

restmenu 在插入之后

[
["ItemName": Cheese Burger, "ItemPrice": 50, "ItemQuant": "2"], 
["ItemName": Veg Burger, "ItemPrice": 30, "ItemQuant": 0], 
["ItemName": Chicken Burger, "ItemPrice": 50, "ItemQuant": 0], 
["ItemName": Veg & Crisp Burger, "ItemPrice": 45, "ItemQuant": 0], 
["ItemName": Maharaja Burger, "ItemPrice": 60, "ItemQuant": 0], 
["ItemName": Coke, "ItemPrice": 50, "ItemQuant": 0], 
["ItemName": Pepsi, "ItemPrice": 50, "ItemQuant": 0]
]

如何计算“ItemQuant”的键值总数?

【问题讨论】:

  • 如果ItemName 不重复,您可以使用cartArrayDict.count 作为ItemName 的总数。您可以将其添加到集合中以消除冗余。
  • 我会试试这两个然后通知你们]
  • 它的工作thnx寻求帮助
  • @GurjitSingh,您需要ItemNames 的数组?
  • 目前我需要组合“ItemQuant”的总数才能在购物车中显示

标签: ios arrays swift uitableview


【解决方案1】:

这是一种计算cartArrayDict 中项目数的方法,同时确保仅包含"ItemName" 中的那些键。它使用数组的reduce() 函数和字典的所需键,如果键不存在,则使用 nil 合并运算符。

如何获取字典数组中的项目数(按键)

let count: Int = cartArrayDict.reduce(0) {
    $0 + ($1["ItemName"] != nil ? 1 : 0)
}
print(count) // Or do whatever you want with the value

如何获得数量的总和

这里是如何获得数量的总和,如 cmets 中所要求的那样。

let totalQuantity: Int = cartArrayDict.reduce(0) {
    $0 + ($1["ItemQuant"] as? Int ?? 0)
}
print(totalQuantity) // Or do whatever you want with the value

如何获得一种商品的总价

我已经把它作为一个函数来呈现。

func getTotalPrice(for name: String) -> Int {
    let totalPrice: Int = cartArrayDict.reduce(0) {
        $0 + ($1["ItemName"] == name ? $1["ItemPrice"] as? Int : 0)
    }
    return totalPrice
}

let totalPriceForCoke = getTotalPrice(for: "Coke")

请注意,这假定键 "ItemName" 的值是 String 类型。目前您的值不是字符串,我不确定为什么会这样。我建议像这样更改它:"Coke" 而不是 Coke

【讨论】:

  • 但是如果我想让“ItemQuant”获取状态栏的数量怎么办?它为此返回 0
  • @GurjitSingh 我已经更新了答案以使其更具普遍性。只需将字符串“ItemName”更改为“ItemQuant”。请注意,这将计算具有项目数量的元素数量,而不是总组合数量。您需要将总数量加在一起吗?
  • 实际上我需要显示购物车中商品数量的总数量
  • 顺便说一句,我的代码使用了三元条件运算符和零合并运算符,它们非常有用。您可以在这里找到更多信息:developer.apple.com/library/content/documentation/Swift/…
  • @GurjitSingh 我以为你会知道的,但我提供了更多信息以防万一:)
【解决方案2】:

你有字典数组:

var cartArrayDict = [[String:Any]]()

您需要映射cartArrayDict 以获取ItemName 的数组:

let itemNames: [String] = cartArrayDict.map( { $0["ItemName"] }) as? [String] 

要删除重复值,只需将其传递给Set 并重新转换为数组:

let itemNameArray = Array(Set(itemNames))

总的来说,您可以找出 ItemNameArray 为:

    let cartArrayDict = [
        ["ItemName": "Cheese Burger", "ItemPrice": 50, "ItemQuant": "2"],
        ["ItemName": "Veg Burger", "ItemPrice": 30, "ItemQuant": 0],
        ["ItemName": "Chicken Burger", "ItemPrice": 50, "ItemQuant": 0],
        ["ItemName": "Veg & Crisp Burger", "ItemPrice": 45, "ItemQuant": 0],
        ["ItemName": "Coke", "ItemPrice": 60, "ItemQuant": 0],
        ["ItemName": "Coke", "ItemPrice": 50, "ItemQuant": 0],
        ["ItemName": "Pepsi", "ItemPrice": 50, "ItemQuant": 0]
    ]

    if let itemsArr = cartArrayDict.map( { $0["ItemName"] }) as? [String] {
        let itemNameArray = Array(Set(itemsArr))
        print(itemNameArray)
    }

    // Result: ["Veg Burger", "Chicken Burger", "Pepsi", "Cheese Burger", "Coke", "Veg & Crisp Burger"]

【讨论】:

  • 请不要在 Swift 答案中使用 force unwrap !,尤其是对于初学者。花时间提供一个非致命的答案。谢谢
  • @Moritz,我认为用户想要“我如何计算“ItemName”的 keyValues 总数。
  • @Moritz,更新了强制解包! 的代码,并再次将Set 转换为Array
猜你喜欢
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 2021-08-04
相关资源
最近更新 更多