当前位置: 首页 > 面试题库 >

通过字典中键的字符串值快速过滤字典的3个过滤器数组

公孙辰龙
2023-03-14
问题内容

我有这样的课

class FoundItem : NSObject {

var id : String!
var itemName : String!
var itemId : Int!
var foundBy : String!
var timeFound : String!

init(id: String,
    itemName: String,
    itemId: Int,
    foundBy: String,
    timeFound: String)

{
    self.id = id
    self.itemName = itemName
    self.itemId = itemId
    self.foundBy = foundBy
    self.timeFound = timeFound

}

我在我的参考

class MapViewVC: UIViewController, MKMapViewDelegate {

var found = [FoundItem]()

var filterItemName : String()

}

我的FoundItem是根据FoundItemFirebase查询的类生成的字典数组。然后,我得到了itemName从另一个视图控制器(该didSelection函数是集合视图)生成的字符串。我想获取该字符串,然后使用与我之前itemNameitemName字符串相等的字符串过滤或搜索数组viewController。然后删除不等于itemName。不仅对象,而且包含非等键,值对的整个数组。我已经找了几天了,但我坚持过滤从类创建的字典数组。我已经看过并尝试过NSPredicates,for-
in循环,但是最终发生的一切都是创建一个新数组或bool来查找我的值或键相等。这是我编写的当前函数。

func filterArrayBySearch() {

    if self.filterItemName != nil {

        dump(found)

        let namePredicate = NSPredicate(format: "itemName like %@", "\(filterItemName)")
        let nameFilter = found.filter { namePredicate.evaluate(with: $0) }

        var crossRefNames = [String: [FoundItem]]()
        for nameItemArr in found {
            let listName = nameItem.itemName
            let key = listName

            if crossRefNames.index(forKey: key!) != nil {

                crossRefNames[key!]?.append(nameItemArr)

                if !("\(key)" == "\(filterItemName!)") {

                    print("------------- Success have found [[[[[[    \(key!)    ]]]]]] and \(filterItemName!) to be equal!!")

                     // crossRefNames[key!]?.append(nameItemArr)

                } else {

                    print("!! Could not find if \(key!) and \(filterItemName!) are equal !!")
                }


            } else {

                crossRefNames[key!] = [nameItemArr]
            }
        }

    } else {

        print("No Data from Search/FilterVC Controller")
    }
}

有人可以帮忙吗?似乎很容易找到值,然后过滤出不等于itemName字符串的字典,但是我一直在碰壁。然后自己进入for-
in循环:P尝试不同的事情来实现相同的任务。


问题答案:

希望我能理解您的要求。您提到了“字典数组”,但实际上您发布的代码中的任何地方都没有字典数组。

据我所知,您正在询问如何查找found数组中itemName等于该filterItemName属性的所有条目。

如果是这样,您需要做的只是:

let foundItems = found.filter { $0.itemName == filterItemName }

而已。

其他一些想法:

如果你想搜索其中的项目filterItemName包含在itemName,你可以这样做:

let foundItems = found.filter { $0.itemName.contains(filterItemName) }

lowercased()如果要进行不区分大小写的搜索,也可以使用该功能。

您还可以将找到的元素的属性返回到数组中:

let foundIds = found.filter { $0.itemName == filterItemName }.map { $0.itemId }



 类似资料:
  • 问题内容: 我有一个字典列表和每个字典的key(比方说)“型”,这可以有值,等我的目标是过滤掉这些字典到同一个字典列表,但只有一个的那些某些“类型”。我想我真的很在理解问题。 因此,示例列表如下所示: 我有一个键值列表。举例来说: 预期的结果列表如下所示: 我知道我可以用一组for循环来做到这一点。我知道必须有一个更简单的方法。我发现此问题有很多不同的风格,但没有一个完全符合要求并回答了这个问题。

  • 问题内容: 我需要使用字典来过滤数据帧,该字典的键是列名,值是我要过滤的值: 但是我想做些事情 但这会多次过滤数据帧,一次过滤一个值,而不是一次应用所有过滤器。有没有办法以编程方式进行? 编辑:一个例子: 给 但预期结果是 仅应选择最后一个。 问题答案: IIUC,您应该可以执行以下操作: 通过制作一个系列来与以下项目进行比较: 选择以下内容的相应部分: 查找它们匹配的位置: 查找它们 都 匹配的

  • 问题内容: 我是用python开发东西的C编码器。我知道如何在C语言中执行以下操作(以及因此在应用于Python的类似C的逻辑中),但是我想知道这样做的“ Python”方式是什么。 我有一个字典d,我想对项的子集进行操作,只有那些键(字符串)的项包含特定的子字符串。 即C逻辑将是: 我在想python版本会像 我在这里找到了很多有关过滤字典的文章,但是找不到与之相关的文章。 我的字典未嵌套,我正

  • 问题内容: 我正在研究AngularJS教程,并了解的基础知识 但是,开箱即用的实现似乎仅限于将项目列表过滤为输入的确切单词或短语。 示例:如果查询是“ table cloth”,则结果列表可以包含带有短语“ Decorative table cloth”的结果,但由于过滤器只是一个连续的搜索字符串,因此将不包括“ Table fortable装饰布”。 我知道可以添加自定义过滤器,但乍一看似乎主

  • 问题内容: 这个问题已经在这里有了答案 : 获取字典中具有最大值的键? (25个答案) 4年前关闭。 我正在尝试获取dict键,其值是所有dict值的最大值。 我发现了两种方法,都不够优雅。 有没有更好的方法? 问题答案: 使用参数可以: 演示: 该参数接受一个函数,对于可迭代的每个条目,它将找到该函数为其返回最大值的那个条目。

  • 问题内容: 我有以下两个玩具字典 我想得到一个唯一的字典,在其中我将第二个字典值堆叠在第一个字典之后,并放在相同的方括号内。 我尝试了以下代码 但是我获得的输出在每个键的列表中有两个列表,即 而我想获得 如何使用一行或两行代码来实现? 问题答案: 您几乎拥有了它,而是使用了附加两个列表的方法: