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

Exclude element in array when iterating using 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.. 有没有可能

请告诉我

我只是按照你的问题描述做一个filter,你想通过删除另一个数字来filter这些数字。

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

let newNum = myNums.filter({ !excludeNums.contains([=10=]) })

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

如果您需要制作地图,可以先制作 map 然后 filter

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

这映射为将两者乘以 2,然后通过从列表中删除新的 2 进行过滤。如果你想删除初始 2 你必须先过滤然后映射。由于 return 和 [Int] 您可以根据需要以任何顺序调用操作。

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

nums.compactMap { (num) -> Int?在 .... 如果数字 == 2 { return 无 }

我建议你使用 filter 而不是 map:

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

如果一定要用map,那就用compactMap:

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

希望对您有所帮助

filtermap 更适合您的用例。

如果您只想排除 1 个号码:

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

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

func getXYZ(nums: [Int]) -> [Int] {
    let excluded: Set<Int> = [2,4]
    return nums.filter { !excluded.contains([=11=]) }
}