【问题标题】:How to filter inner arrays from multi-dimensional array如何从多维数组中过滤内部数组
【发布时间】:2016-09-28 22:00:07
【问题描述】:

我正在尝试使用 swift 库 Dollar (https://github.com/ankurp/Dollar) 从基于 submission_id 的数组(称为 array)中提取变量(safety_rating_idscore 等) find 方法,以便我以后可以使用它们发出 POST 请求(最终,我希望能够用拉取的数组变量替换参数中的硬编码值),但我来自 find 的结果都返回 nil。

这些是我想要的内部数组,其中 submission_id 是来自此数组 https://codeshare.io/zr1pw27(第 22-36 行):

{
 "submission_id" : "27",
 "name" : "Equipment",
 "task_id" : "37",
 "points" : "10",
 "safety_rating_id" : 105,
 "score" : "9"
}, {
 "submission_id" : "27",
 "name" : "Emergency Equipment",
 "task_id" : "37",
 "points" : "10",
 "safety_rating_id" : 106,
"score" : "9"
}

代码:

  var array: [JSON] = []   
  func submitScore(onCompletion: () -> (), onError: ((NSError) -> ())? = nil) {

    guard let endPoint = Data.sharedInstance.submitScoreEndpoint
        else { print("Empty endpoint"); return }

    let user = Users()

    let test = $.find(self.array, callback: { $0 == 27 })
    print(test)

    let Auth_header = [
        "Authorization" : user.token,
        ]

    let parameters: [String:Array<[String:Int]>] = [
        "ratings" : [
            [
                "safety_rating_id" : 105,
                "schedule_job_id" : 18,
                "score" : 9,
                "submission_id" : 27
            ],
            [
                "safety_rating_id" : 106,
                "schedule_job_id" : 18,
                "score" : 10,
                "submission_id" : 27
            ]
        ]
    ]


Alamofire.request(.POST, endPoint, headers: Auth_header, parameters: parameters, encoding: .JSON)
        .validate()
        .responseJSON {
        response in

        switch response.result {
        case .Success(let data):
            let json = JSON(data)
            print(json)
            onCompletion()
        case .Failure(let error):
            print("Request failed with error: \(error)")
            onError?(error)
        }

    }

}

更新

我能够使用submission_id 27 获取数组,但我想从两个submission_id : 27 数组中删除nametask_id AND 添加一个schedule_job_id 我从别处得到。

我尝试使用for in 循环从我想要的变量创建我自己的数组,但我不断收到nil 崩溃。这是新数组的样子https://codeshare.io/3VJSo

最后我想做一个"ratings" : [chosenArray]

【问题讨论】:

标签: ios arrays alamofire swifty-json dollar.swift


【解决方案1】:

所以在回调内部传递的是数组中的每个元素,因此您将传递字典对象。所以如果你想在数组中找到一个特定的项目,你应该这样做

let test = $.find(array) { $0["submission_id"]! == "27" }

如果您希望数组中所有提交 id 为 27 的元素,请使用 filter

let test = array.filter { $0["submission_id"]! == "27" }

要从字典对象中删除属性,您需要对数组中的每个项目调用removeValueForKey 方法。

let jsonWithMySubmissionId = self.array.filter ({ $0["submission_id"]! == 27 })
for json in jsonWithMySubmissionId {
  json.removeValueForKey("name")
  json.removeValueForKey("task_id")
  ...
}

【讨论】:

    【解决方案2】:

    for 循环中的dic 必须是NSMutableDictionary 类型。因为你不能操纵NSDictionary

    第二件事没有像removeValueForKey这样的方法。

    您应该使用removeObjectForKeyremoveObjectsForKeys

    removeObjectsForKeys 中,您必须传递参数数组(键作为参数)。

    removeObjectForKey 中,您可以传递一个字符串(键)作为参数。

    【讨论】:

      【解决方案3】:

      我认为您使用 $ 错误。 当您在self.array 上调用$.find 时,该数组包含JSON 对象,不确定该对象到底是什么,但我认为它是字典。 所以我认为你应该这样做:

      let jsonWithMySubmissionId = self.array.filter ({ $0["submission_id"]! == 27 }).first
      

      然后,我会避免对字典强制展开。只是为了让您在一行代码中理解我的观点。

      编辑:

      然后你可以遍历数组并像这样提取你的字段:

      let jsonWithMySubmissionId = self.array.filter ({ $0["submission_id"]! == 27 })
      for json in jsonWithMySubmissionId {
        json["name"] = nil
        json["task_id"] = nil
        ...
      }
      

      【讨论】:

      • 您好,您知道如何从生成的每个数组中删除nametask_id(请参阅更新后的帖子)
      • 查看我对原帖的编辑,如果它解决了您的问题,请考虑接受该答案
      猜你喜欢
      • 2013-11-27
      • 2015-12-30
      • 2012-03-01
      • 1970-01-01
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多