【问题标题】:Get index of object from array of dictionary with key value从具有键值的字典数组中获取对象的索引
【发布时间】:2016-06-02 21:05:22
【问题描述】:

我有一个带字典的数组。

现在我想获取具有特定键值的对象的索引号。

喜欢 key = "xyz" 和 value = "abc"。

我需要在字典中具有以上匹配的对象的索引。

{
        Id = 20085;
        IsNew = 1;
        Title = Circular;
    },
        {
        Id = 20088;
        IsNew = 0;
        Title = Query;
    },
        {
        Id = 20099;
        IsNew = 1;
        Title = Blog;
    },
        {
        Id = 20104;
        IsNew = 1;
        Title = News;
    },
        {
        Id = 20172;
        IsNew = 1;
        Title = AssignTask;
    },
        {
        Id = 20183;
        IsNew = 1;
        Title = Gallery;
    },
        {
        Id = 20204;
        IsNew = 1;
        Title = Poll;
    },
        {
        Id = 20093;
        IsNew = 1;
        Title = Assignment;
    },
        {
        Id = 20209;
        IsNew = 1;
        Title = Activity;
    },
        {
        Id = 20130;
        IsNew = 1;
        Title = Behaviour;
    },
        {
        Id = 20180;
        IsNew = 1;
        Title = Result;
    }

现在我需要具有 key = "Title" 和 value = "result" 的对象索引

【问题讨论】:

  • 您能否提供更多背景信息?
  • 字典在这里是一个不合适的选择。这些应该是结构。

标签: ios swift


【解决方案1】:

您可以为此使用indexOf(_:)

let index = array.indexOf{ $0["key"] == value }

在 Swift 3.0 中,它已重命名为 index(Where:)

let index = array.index{ $0["key"] == value }

你可以在here看到这个。

【讨论】:

  • 这不会检查值
  • 你能从上面的回复中添加真实的例子吗,谢谢。
  • 您展示的是 JSON,鉴于您提供的信息很少,我只是在做最好的近似。我发布了一个工作示例的链接。只需将 NSArray 转换为适当的 Swift 数组:dev.eltima.com/post/96538497489/…
  • 正确答案并祝贺 Swift 3.0 版本 ;-)
【解决方案2】:

这是使用 json 解析器后应该做的事情

 let array:NSArray = [
[
    "Id": 20130,
    "IsNew": 1,
    "Title":"Behaviour"
],
[
    "Id": 20180,
    "IsNew": 1,
    "Title":"Result"
]]


let k = array as Array
let index = k.indexOf {
    if let dic = $0 as? Dictionary<String,AnyObject> {
        if let value = dic["Title"]  as? String
            where value == "Result"{
         return true
        }
    }
    return false
}

print(index) // index

【讨论】:

  • 谢谢,但我有 NSArray
  • 它杀了我你能帮帮我吗
  • 让 arr = arrHomeUpdate as Array 让 index = arr.indexOf{$0["Title"] == strTitle as?字符串}
  • 我已经更新了答案,假设您使用的是NSArray,并且您确实索引了您返回的AnyObject 检查对象是否是字典然后继续。
  • @KushThakkar 你为什么还要使用 NSArray?
【解决方案3】:

我首先将 id 值映射到一个数组,然后获取您要查找的 id 的索引。

func getIndexOf(itemID: Int) -> Int {

    //Map out all the ids from the array of dictionaries into an array of Integers
    let keysArray = dictionaries.map { (dictionary) -> Int in
        return dictionary.value(forKey: "Id")
    }

    //Find the index of the id you passed to the functions
    return keysArray.index(of: itemID)
}

【讨论】:

    【解决方案4】:

    其他主流方式

    func getIndex(of key: String, for value: String, in dictionary : [[String: Any]]) -> Int{
        var count = 0
        for dictElement in dictionary{
            if dictElement.keys.contains(key) && dictElement[key] as! String == value{
                return count
            }
            else{
                count = count + 1
            }
        }
        return -1
    
    }
    
    var sampleDict : [[String:Any]] = [
        [
            "Id" : 20130,
            "IsNew" : 1,
            "Title" : "Behaviour"
        ],
        [
            "Id" : 20130,
            "IsNew" : 1,
            "Title" : "Result"
            ],
    ]
    
    let index = getIndex(of: "Title", for: "Result", in: sampleDict)
    
    print(index)
    

    这将打印 1。

    【讨论】:

      【解决方案5】:

      此答案适用于 Swift 5.2 及以上版本。

       arr.append(["Title":titleName,"ID":1,"Result":true])
       arr.append(["Title":titleName,"ID":2,"Result":true])
       arr.append(["Title":titleName,"ID":3,"Result":true])
       arr.append(["Title":titleName,"ID":4,"Result":true])
      

      这是一个字典格式的数组。如果您想查找 ID == 3 的对象的索引

      func findIndex(Id : Int ) -> Int? {
          
          guard let index = arr.firstIndex(where: {
              if let dic = $0 as? Dictionary<String,AnyObject> {
                  if let value = dic["ID"]  as? Int, value == Id {
                      
                      return true
                  }
                  
              }
              return  false
          }) else { return nil }
          return index
      }
      
      let myIndex = findIndex(3)
      self.arr.insert( ["Title":titleName,"ID":10,"Result":true]) at: myIndex)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-25
        • 1970-01-01
        • 1970-01-01
        • 2021-03-17
        • 2011-05-31
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        相关资源
        最近更新 更多