我有一个"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,但我想不出一种更好的方法来查看数组数组并将其与另一个数组匹配。

谢谢!

最佳答案

您可以通过先比较countselectedDetails上的detailTraits,然后比较实际值来进行优化,以达到最佳效果。这样,选项集将减少为仅具有完全相同计数的detailTraits。例如,您只需要将字符串值与包含正好3个项目的数组进行比较(如果selectedDetails["A", "B", "C"]),完全避免循环中的一次迭代。

希望这可以帮助

08-16 14:29