从结构中获取相同标签的值之和

时间:2019-01-20 05:18:39

标签: arrays swift generics struct

我需要从此信息中将未出现的添加到Array中。如果有重复的话,钱将被累加,然后被存为一体。我该如何实现?数据可能很多。

import UIKit

struct TestData {
    let Label : String
    var Money : Double
}

var SaveDate = [TestData]()
var TestD = [TestData]()
SaveDate.append(TestData(Label: "test1", Money: 55))
SaveDate.append(TestData(Label: "test1", Money: 35))
SaveDate.append(TestData(Label: "test2" , Money: 15))
SaveDate.append(TestData(Label: "test1" , Money: 10))
SaveDate.append(TestData(Label: "test3" , Money: 30))
print([{Label "test1", Money 55}, {Label "test1", Money 35}, {Label "test2", Money 15},{Label "test1", Money 10}, {Label "test3", Money 30}])


//Result presentation
//Label1 = test1 , Money = 100
//Label2 = test2 , Money = 15
//Label3 = test3 , Money = 30

3 个答案:

答案 0 :(得分:1)

就这么简单。

let dict = SaveDate.reduce(into: [String: Double]()) { (result, data) in
    result[data.Label, default: 0] += data.Money
}

或更简洁地说,

let dict = SaveDate.reduce(into: [String: Double]()) { $0[$1.Label, default: 0] += $1.Money }
  

dict

     

// [“ test2”:15.0,“ test3”:30.0,“ test1”:100.0]


注意:您应该根据Swift API guidelines使用 lowerCamelCase 作为变量名。

答案 1 :(得分:0)

这可能会有所帮助:

import UIKit

struct TestData {
    let label : String
    var money : Double
}

var saveData = [TestData]()
saveData.append(TestData(label: "test1", money: 55))
saveData.append(TestData(label: "test1", money: 35))
saveData.append(TestData(label: "test2" , money: 15))
saveData.append(TestData(label: "test1" , money: 10))
saveData.append(TestData(label: "test3" , money: 30))

let testData = saveData.reduce([TestData](), { currentData, newElement in
    var newDataArray = currentData // Swift doesn't allow modifying parameter
    if newDataArray.count == 0 {
        newDataArray.append(newElement)
    } else {
        if let sameLabelIndex = newDataArray.firstIndex(where: { $0.label == newElement.label }) {
            newDataArray[sameLabelIndex].money += newElement.money
        } else {
            newDataArray.append(newElement)
        }
    }
    return newDataArray
})

print(testData)

Apple在reduce上的文档:https://developer.apple.com/documentation/swift/array/2298686-reduce

答案 2 :(得分:0)

您可以使用字典来完成此操作。

dictionaryOfValues[currentItem.Label] = (dictionaryOfValues[currentItem.Label] == nil ? currentItem.Money : dictionaryOfValues[currentItem.Label] + currentItem.Money)

我在一个Swift Playground中运行了它。

当您遇到标签时,词典可以跟踪您的情况。我之所以addUp()是因为它需要要么1)将其添加到字典中,要么2)将当前值附加到字典中已经存在的值上。

准备就绪后,您可以致电$('#ste').on('click',function(){ ,它将为您完成工作。