过滤非整数并将它们相加为2d数组

时间:2018-01-31 10:14:28

标签: arrays swift

快速提问。因此我的阵列是:

OutsideIncome(userName: "Beth", allOthers: 0, babysitting: 0, houseCleaning: 0, mowingLawns: 0, summerJobs: 0),
OutsideIncome(userName: "Molly", allOthers: 0, babysitting: 0, houseCleaning: 0, mowingLawns: 0, summerJobs: 0)

一个元素是String,其余元素是Ints。我怎样才能得到Ints的总和?

Code I尝试过:

#1:FOR LOOP - 没有工作

for item in OutsideIncome.incomeArray.filter({ $0.userName != self.currentUserName }).reduce(0 , { $0 + $1 }) {
    tempOutsideIncome = item.allOthers + item.babysitting + item.houseCleaning + item.mowingLawns + item.summerJobs
}

#2:过滤器减少 - 没有工作

let outsideIncome = OutsideIncome.incomeArray.filter({ $0.userName != self.currentUserName })
outsideIncome.reduce(0, { $0 + $1 })

#3:FILTER - 有效,但很麻烦。必须有一个更简单的方法。

let tempArray = OutsideIncome.incomeArray.filter({ $0.userName == self.currentUserName })
let tempOutsideSum = (tempArray.first?.allOthers)! + (tempArray.first?.babysitting)! + (tempArray.first?.houseCleaning)! + (tempArray.first?.mowingLawns)! + (tempArray.first?.summerJobs)!

我在想某种方式mapfilter reduce它,但我无法弄明白。

任何人都有解决方案吗?

更新

感谢您的回答。我的最终代码:

struct OutsideIncome {
    let userName: String
    let allOthers: Int
    let babysitting: Int
    let houseCleaning: Int
    let mowingLawns: Int
    let summerJobs: Int

    // create 'computed property'
    var totalJobs: Int {
        return allOthers +
            babysitting +
            houseCleaning +
            mowingLawns +
        summerJobs
    }
}

let currentUserName = "Beth"

let array = [OutsideIncome(userName: "Beth", allOthers: 1, babysitting: 0, houseCleaning: 0, mowingLawns: 0, summerJobs: 0),
OutsideIncome(userName: "Molly", allOthers: 0, babysitting: 0, houseCleaning: 0, mowingLawns: 0, summerJobs: 0)]

let result = array.filter({ $0.userName == user.firstName }).reduce(0, { $0 + $1.totalJobs })
}

1 个答案:

答案 0 :(得分:2)

创建计算属性

    var totalJobs: Int {
    return allOthers +
        babysitting +
        houseCleaning +
        mowingLawns +
    summerJobs
}

然后你可以链过滤和减少

let result = array.filter { $0.userName ==  currentUserName}.reduce(0) { (res, item) -> Int in
return res + item.totalJobs

}