arrays - 高效的 Swift 数组比较
问题描述
struct Area {
var name: String
var isSelected: Bool
}
我有两个清单:
- 列表一:它有完整的区域列表。
- 列表二:它具有用户选择的列表一中的区域子集(但未设置选定状态)
我想做的是创建一个新的区域列表,其中包含两个列表中的项目,但是如果列表一中的元素在列表二中,我想将 isSelected 属性更新为 true。
我写了当前的方法,但它有缺陷且效率低下:
private func didGetCurrentUserSession(_ usersAreas: [Area]?, allAreas: [Area]){
guard let usersAreas = usersAreas else {return}
var newAreasList = [Area]()
for area in allAreas {
for userArea in usersAreas {
if userArea.name == area.name {
newAreasList.append(Area(name: area.name, isSelected: true))
break
}
}
newAreasList.append(Area(name: area.name, isSelected: false))
}
_loadingAreas.onNext(false)
_areas.onNext(newAreasList)
}
对此的任何帮助将不胜感激。宁愿通过使用非常 Swifty 的方法来实现这一点。
解决方案
让我们获取用户区域的名称:
let userAreaNames = Set((usersAreas ?? []).map { $0.name })
绘制其他区域
let newAreas = allAreas.map { area in
return Area(
name: area.name,
isSelected: userAreaNames.contains(area.name)
)
}
推荐阅读
- javascript - 多个文件检查扩展名是 Pdf
- histogram - ROOT:将根文件与 hadd 和权重相加
- java - 尝试在 Android Studio 中执行单元测试时出现“JUnit 版本 3.8 或更高版本”错误
- node.js - 如何模拟导入?
- c# - 确认电子邮件时 ASP.NET Core 令牌无效,但令牌似乎有效
- r - 将字符向量转换为不带引号的对象名称
- json - java.lang.NoSuchMethodError:com.google.gson.GsonBuilder.setLenient()Lcom/google/gson/GsonBuilder;
- java - 对齐按钮中的 SWT 问题
- php - 如何在 laravel 中从数据库中传递值
- java - 带有 ModelMapper 的 LazyInitializationException (Spring + Hibernate)