You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以Geofire键数组为参考对Venue对象数组按venueID排序?

按参考数组顺序排序Venue数组的Swift实现方案

我来帮你搞定这个排序需求!根据你提到的思路,我们可以用字典建立索引的方式实现高效排序,同时完美适配你要求的逃逸闭包返回逻辑。

完整实现代码

func sortVenues(unsortedArray: [Venue], sortingGeoArray: [String], completion: @escaping ([Venue]) -> Void) {
    // 建立venueID到Venue对象的映射字典,实现O(1)时间复杂度的查找
    let venueIDMap = Dictionary(uniqueKeysWithValues: unsortedArray.map { ($0.venueID, $0) })
    
    // 按照参考数组的顺序提取对应Venue,自动完成排序
    let sortedVenues = sortingGeoArray.compactMap { venueIDMap[$0] }
    
    // 通过逃逸闭包返回排序后的结果
    completion(sortedVenues)
}

代码逻辑拆解

  • 建立映射字典:我们把未排序数组里的每个Venue对象,用它的venueID作为key存入字典。这一步相当于给所有venue做了个“快捷查找表”,后续查找单个venue的速度从O(n)降到了O(1),数据量大的时候优势特别明显。
  • 按参考数组排序:用compactMap遍历sortingGeoArray,逐个从字典里取出对应的Venue对象。compactMap会自动忽略那些在未排序数组里找不到的venueID(也就是字典里不存在的key),最终得到的数组顺序完全和参考数组一致。
  • 逃逸闭包返回:最后把排序好的数组通过completion闭包返回,满足你需要的异步返回要求。

扩展场景补充

如果你需要保留未排序数组里所有元素(包括那些不在参考数组里的venue),可以在排序后追加剩余元素:

func sortVenuesWithRemaining(unsortedArray: [Venue], sortingGeoArray: [String], completion: @escaping ([Venue]) -> Void) {
    let venueIDMap = Dictionary(uniqueKeysWithValues: unsortedArray.map { ($0.venueID, $0) })
    let sortedVenues = sortingGeoArray.compactMap { venueIDMap[$0] }
    
    // 筛选出参考数组里没有的venue,追加到排序结果后面
    let remainingVenues = unsortedArray.filter { !sortingGeoArray.contains($0.venueID) }
    let finalSortedVenues = sortedVenues + remainingVenues
    
    completion(finalSortedVenues)
}

内容的提问来源于stack exchange,提问作者Roggie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:18:34