как подсчитать общее количество ключей в массиве объекта - PullRequest
0 голосов
/ 22 мая 2018

я получил массив словаря в структуре CartDataModal

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

полученные данные в формате ниже

остальные после вставки

[
["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"?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Вот способ подсчитать количество элементов в cartArrayDict, при этом убедитесь, что включены только те ключи, которые "ItemName".Он использует функцию reduce() массива с желаемым ключом словаря, с оператором объединения нулей, если ключ не существует.

Как получить количество элементов (по ключу)в массиве словарей

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

Как получить общую сумму величин

Вот как можно получить общую сумму величин, как указано в комментариях.

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.

0 голосов
/ 22 мая 2018

У вас есть массив словаря:

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"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...