使用地图进行迭代时排除数组中的元素

时间:2019-02-11 01:58:25

标签: ios arrays swift array-map

我有类似下面的代码

let myNums = getXYZ(nums: [1,2,3,4,5])

func getXYZ(nums: [Int]) -> [Int] {
let newNum = nums.map { (num) -> Int in

    if num == 2 {
    //do something and continue execution with next element in list like break/fallthrough
        return 0
    }
    return num
}

return newNum

}

print(myNums)`

这会打印[1,0,3,4,5]

但是我希望输出为[1,3,4,5]。如何排除2?我想更改使用的if语句,使其在看到数字2时不包含在数组中

我必须在这里使用.map,但要排除2 ..是否有可能

请让我知道

4 个答案:

答案 0 :(得分:1)

我只是按照您的问题进行了filter的操作,您想通过删除另一个数字来filter个数字。

var myNums = [1, 2, 3, 4, 5]
let excludeNums = [2]

let newNum = myNums.filter({ !excludeNums.contains($0) })

print(newNum) //1, 3, 4, 5

如果需要绘制地图,可以先做map,然后再做filter

let newNum = myNums.map({ $0*2 }).filter({ !excludeNums.contains($0) })
print(newNum) //4, 6, 8, 10

这映射为既乘以2,又通过从列表中删除新的2进行过滤。如果要删除首字母2,则必须先过滤,然后再映射。由于两者都返回[Int],因此您可以根据需要以任何顺序调用操作。

答案 1 :(得分:1)

filtermap更适合您的用例。

如果您只想排除1个数字:

func getXYZ(nums: [Int]) -> [Int] {
    return nums.filter { $0 != 2 }
}

如果要排除数字列表,请将这些排除项存储在Set中,因为Set.containsO(1)时间运行,而Array.contains在{{1}时间运行}时间。

O(n)

答案 2 :(得分:0)

根据@koropok的建议,我必须进行以下更改

nums.compactMap {(num)->整数?在 .... 如果num == 2 { 返回零 }

答案 3 :(得分:0)

我建议您使用过滤器而不是地图:

let myNums = [1,2,3,4,5]
let result1 = myNums.filter{ return $0 != 2 }
print(result1) // This will print [1,3,4,5]

如果必须使用地图,请使用compactMap:

let result2 = myNums.compactMap { return $0 == 2 ? nil : $0 }
print(result2) // This will print [1,3,4,5]

希望这会有所帮助