如何使用map函数从swift中的数组中获取替代索引数据

如何使用map函数从swift中的数组中获取替代索引数据,swift,Swift,我从上面一行中获取所有产品名称,但我只想使用map从奇数索引中获取名称。有可能吗?这里有一种方法: struct Product { let name: String let weight: Double } let productsList = [Product(name: "AAA", weight: 1), Product(name: "BBB", weight: 2), Product(na

我从上面一行中获取所有产品名称,但我只想使用map从奇数索引中获取名称。有可能吗?

这里有一种方法:

struct Product {
    let name: String
    let weight: Double
}

let productsList = [Product(name: "AAA", weight: 1),
                    Product(name: "BBB", weight: 2),
                    Product(name: "CCC", weight: 3),
                    Product(name: "DD", weight: 4),
                    Product(name: "RR", weight: 5),
                    Product(name: "EEE", weight: 6),
                    Product(name: "FGT", weight: 7),
                    Product(name: "DSF", weight: 8),
                    Product(name: "VCVX", weight: 9),
                    Product(name: "GFDHT", weight: 10)]

print(productsList.map { $0.name })

枚举的
方法将每个产品转换为一个2元组,该元组包含产品及其数组中的索引(
偏移量
)。然后,
过滤
只保留索引为奇数(或偶数)的产品。之后,您需要将2元组映射到产品名称。

您可以将奇数索引映射到相应的产品名称:

print(
    productsList
        .enumerated()
        .filter { $0.offset % 2 == 1 }
        .map { $0.element.name }
)
另一种方法是在
enumerated()
序列上使用
compactMap

let oddIndexedProducts = stride(from: 1, through: productsList.count, by: 2)
    .map { productsList[$0].name }

print(oddIndexedProducts) // ["BBB", "DD", "EEE", "DSF", "GFDHT"]

根据经验:“filter+map=compactMap”(“Swift 3中的flatMap”)

.filter{$0.offset&1==1}
可能更快,但答案很好+1要完全回答这个问题,您的
映射应返回
$0.element.name
@par Ah!遗漏了问题的这一部分。@par:我强烈假设编译器为
$0.offset%2==1
$0.offset&1==1
@MartinR生成了相同的机器代码。谢谢你找到了这个,这很有趣(你的这么多答案也是如此!)。对于我(无可否认是懒惰的)自己,我不确定必须记住反转测试逻辑并启用优化以获得相同的代码是否比知道我可以只查看低位的偶数/奇数并始终获得好结果更容易。我承认,在那个测试中看一个除以二的余数感觉更自然,但作为一个老习惯,我倾向于在我能找到它们的地方获取简单的收益。为了确保我得到了正确的结果,它似乎是旧的
flatMap
功能,对吗?是的,我查过:@Ahmad是的,在Swift 4.1中被重命名。
let oddIndexedProducts = productsList.enumerated().compactMap {
    $0.offset % 2 == 1 ? $0.element.name : nil
}