ios - Swift 3: sum value with group by of an array of objects -
i have code in viewcontroller
var myarray :array<data> = array<data>() in 0..<mov.count { myarray.append(data(...)) } class data { var value :cgfloat var name :string="" init({...}) }
my input of data as:
- 10.5 apple
- 20.0 lemon
- 15.2 apple
- 45
once loop through, return new array as:
- sum(value) group name
- delete last row because no have name
- ordered value
expected result based on input:
- 25.7 apple
- 20.0 lemon
- and nothing else
i wrote many rows of code , confused post it. i'd find easier way, has idea this?
first of data
reserved in swift 3, example uses struct named item
.
struct item { let value : float let name : string }
create data array given values
let dataarray = [item(value:10.5, name:"apple"), item(value:20.0, name:"lemon"), item(value:15.2, name:"apple"), item(value:45, name:"")]
and array result:
var resultarray = [item]()
now filter names not empty , make set
- each name occurs 1 once in set:
let allkeys = set<string>(dataarray.filter({!$0.name.isempty}).map{$0.name})
iterate thru keys, filter items in dataarray
same name, sum values , create new item
total value:
for key in allkeys { let sum = dataarray.filter({$0.name == key}).map({$0.value}).reduce(0, +) resultarray.append(item(value:sum, name:key)) }
finally sort result array value desscending:
resultarray.sorted(by: {$0.value < $1.value})
Comments
Post a Comment