swift 3过滤字典数组按字典中键的字符串值

Cor*_*aud 6 arrays dictionary filter ios 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

}
Run Code Online (Sandbox Code Playgroud)

我把它引用到我的身上

class MapViewVC: UIViewController, MKMapViewDelegate {

var found = [FoundItem]()

var filterItemName : String()

}
Run Code Online (Sandbox Code Playgroud)

FoundItem是从我的类中FoundItem的一个字典数组生成的firebase查询.然后我得到一个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")
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?这似乎是一个简单的任务,找到值,然后过滤掉不等于itemName字符串的字典,但我一直在打墙.并且自己遇到for-in循环:P尝试不同的事情来完成同样的任务.

par*_*par 17

我希望我理解你的要求.你提到了一个"字典数组"但你实际上在你发布的代码中没有任何字典数组.

据我所知,你问的是如何找到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 }

  • 大量的编程建议是,如果您在某天上被卡住了,请寻​​求帮助。有时候讲出来就足够了,有时候其他人会像我一样看到你完全走错了路。有时碰到*每个人*。祝您项目顺利。 (2认同)

IKK*_*KKA 10

使用以下方式对字典数组进行排序

var dict:[[String:AnyObject]] = sortedArray.filter{($0["parentId"] as! String) == "compareId"}
Run Code Online (Sandbox Code Playgroud)

该 过滤器 功能遍历每个项目集合中,并返回一个只包含满足的条件包括项目的集合。

我们可以从这个字典数组中获取单个对象,您可以使用以下代码

var dict = sortedArray.filter{($0["parentId"] as! String) == "compareId"}.first
Run Code Online (Sandbox Code Playgroud)

或者

 let dict = sortedArray.filter{ ($0["parentId"] as! String) == "compareId" }.first
Run Code Online (Sandbox Code Playgroud)