一尘不染

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

swift

我有这样的课

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尝试不同的事情来实现相同的任务。


阅读 210

收藏
2020-07-07

共1个答案

一尘不染

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

据我所知,您正在询问如何查找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 }

2020-07-07