我有一个“Option”类型的数组
。
类Option
包含一个元素optionDetail
。
optionDetail
类包含 detailTraits
的元素,它是一个 [String]
,每个字符串都称为 detailTraitName
.
所以我获取detailTraits的结构看起来像Option
-> optionDetail
-> detailTraits
这将返回我[String]
,或 Option
-> optionDetail
-> detailTraits
-> detailTraitName
,这只会返回我一个字符串
我想将 detailTraits
数组与另一个名为 selectedDetails
的数组(它是一个 [String]
)进行匹配并查找元素其中所有 selectedDetails
都包含在 detailTraits
内。然后我想返回所有符合这种情况的 Option
。
例如,如果我的 selectedDetails
数组包含 ["A", "B"]
,并且我有一个 detailTraits
数组,其中包含["A","C"]
和具有 ["A"]
的一个以及具有 ["A", "B", "C "]
,我只想返回 detailTraits
为 ["A", "B", "C"]
我当前的代码如下所示:
newOptions = option.filter({ $0.optionDetail?.detailTraits.filter({ selectedDetails.contains($0.detailTraitName ?? "") }).count == selectedDetails.count })
有更好的方法吗?这个算法看起来效率很低,因为它可能是 N^3 的数量级,但我想不出更好的方法来查看数组数组并将其与另一个数组匹配。
谢谢!
最佳答案
您可以通过首先比较 selectedDetails
和 detailTraits
上的 count
进行过滤,然后比较实际值来对此进行优化。这样,选项集将减少到只有那些具有完全相同计数的 detailTraits
。例如,您只需将字符串值与包含确切 3 个项目的数组进行比较(如果 selectedDetails
为 ["A", "B", "C"]
),完全避免了循环中的一次迭代。
希望这有帮助
关于arrays - 更快的过滤方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47333097/