给定索引数组,如何在swift中过滤数组?

时间:2016-07-04 09:38:18

标签: ios swift

给定一个索引数组,我想获得myArray的子​​数组,其中包含这些索引的项目。 我目前正在迭代索引数组以创建一个子数组,但我想知道是否可以通过使用.filter函数来实现这一点。

var indexes = [3,4,9,11]
myArray.filter(...)

3 个答案:

答案 0 :(得分:4)

假设

  • 给定的索引是增加顺序,
  • 数组的所有索引有效(即小于 元素数量),

然后一个简单的地图操作就可以了:

let indexes = [2, 4, 7]
let myArray = ["a", "b", "c", "d", "e", "f", "g", "h"]

let filtered = indexes.map { myArray[$0] }
print(filtered) //["c", "e", "h"]

备注:在早期的Swift版本中,有一个PermutationGenerator 正是出于这个目的:

let filtered = Array(PermutationGenerator(elements: myArray, indices: indexes))
print(filtered) //["c", "e", "h"]

但是,这已在Swift 2.2中弃用,将被删除 在Swift 3.我还没有见过Swift 3替代品。

答案 1 :(得分:0)

你可以试试,虽然这远远没有效率。但如果你坚持使用过滤器

,那就是你得到的
let myArray = ["a", "b", "c", "d", "e"]
var indexes = [1, 3]
myArray.filter { (vowel) -> Bool in
    if let index = myArray.indexOf(vowel) {
        return indexes.contains(index)
    }
    return false
}

答案 2 :(得分:0)

您还可以使用flatMap来检索已过滤的subArray

let indexes = [2, 4, 7]
let myArray = ["a", "b", "c", "d", "e", "f", "g", "h"]

let subArray = indexes.flatMap { (index) -> String? in
    return (0 <= index && index < myArray.count) ? myArray[index] : nil
}