如何根据字典的值字符过滤字典?

问题描述 投票:0回答:2

我必须过滤文本字段中包含我的文本的字典。

var arrayData = [["Name":"Sahil"],["Name":"Raman"],["Name":"ashish"],["Name":"Vishnu"],["Name":"Deep"],["Name":"sahil"],["Name":"Swift"]]
//my result should be  like this
[["Name":"Sahil"],["Name":"ashish"],["Name":"Vishnu"],["Name":"Swift"]]
swift dictionary
2个回答
0
投票

不清楚,您稍后在评论中对此进行了解释,但您希望保留键

"Name"
的值,其中包含“s”不区分大小写。

让我们添加几个附加值来显示您之前的尝试失败的原因:

var arrayData = [["Name":"Sahil"],
                 ["Name":"Raman"],
                 ["Name":"ashish"],
                 ["Name":"Vishnu"],
                 ["Name":"Deep"],
                 ["Name":"sahil"],
                 ["Name":"Swift"],
                 ["Name":"s"],
                 ["Name":"S"]]

并简化:

let searchText = "s" // textField.text ?? ""

您尝试过:

let filteredArray1 = arrayData.filter { $0["Name"] == searchText }
print(filteredArray1)

输出:

$> [["Name": "s"]]

所以,只有当 value 恰好等于

"s"
时,你才会得到,这是正常的,你正在使用
==

然后您尝试:

let filteredArray2 = arrayData.filter { $0["Name"]!.contains(searchText) }
print(filteredArray2)

输出:

$>[["Name": "ashish"], ["Name": "Vishnu"], ["Name": "sahil"], ["Name": "s"]]

所以,当它里面有

"s"
时,你就会得到任何值。差不多就是这样,但是当它有一个大写的
"S"
时你就看不到了。 为此,您可以使用
range(of:options:searchRange:local:)
.caseInsensitive
选项。如果结果不是
nil
,就说明已经找到了。

所以你可以使用:

let filteredArray3 = arrayData.filter { $0["Name"]?.range(of: "s", options: .caseInsensitive) != nil }
print(filteredArray3)

输出:

$>[["Name": "Sahil"], ["Name": "ashish"], ["Name": "Vishnu"], ["Name": "sahil"], ["Name": "Swift"], ["Name": "s"], ["Name": "S"]]

0
投票

这应该有效:

var arrayDataFiltered = arrayData.filter { $0["Name"]?.lowercased().contains("s") ?? false }

这里是过滤的文档: https://developer.apple.com/documentation/swift/sequence/3018365-filter

© www.soinside.com 2019 - 2024. All rights reserved.