Фильтровать массив любого объекта на основе свойства объекта - PullRequest
0 голосов
/ 24 октября 2018

Я получаю ответ в этом формате

[
    "1234": {
        "startDate": "1536278400",
        "endDate": "1536796800",
        "playerRank": 1,
        "performance": 100,
        "isProfit": false,
        "members": 1
    },
    "adityaKumar": {
        "startDate": "1536364800",
        "endDate": "1540080000",
        "playerRank": 1,
        "performance": 100,
        "isProfit": false,
        "members": 6
    },
    "madhu60": {
        "startDate": "1539388800",
        "endDate": "1539475200",
        "playerRank": 1,
        "performance": 100,
        "isProfit": false,
        "members": 2
    }
]

Этот ответ имеет тип [string:Any].Я должен отсортировать данные, используя свойство playerRank.Я хочу, чтобы вывод был типа [string:Any].

Как это возможно в Swift?

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

После того, как вы проанализируете JSON, вы получите dictionary типа [String: [String:Any]], т.е.

let data = [
    "1234": [
        "startDate": "1536278400",
        "endDate": "1536796800",
        "playerRank": 1,
        "performance": 100,
        "isProfit": false,
        "members": 1
    ],
    "adityaKumar": [
        "startDate": "1536364800",
        "endDate": "1540080000",
        "playerRank": 1,
        "performance": 100,
        "isProfit": false,
        "members": 6
    ],
    "madhu60": [
        "startDate": "1539388800",
        "endDate": "1539475200",
        "playerRank": 1,
        "performance": 100,
        "isProfit": false,
        "members": 2
    ]
]

Вы можете отсортировать этот словарь, просто используя sorted метод, то есть

let sortedData = data.sorted { 
    if let rank1 = $0.value["playerRank"] as? Int, let rank2 = $1.value["playerRank"] as? Int
    {
        return rank1 < rank2
    }
    return false
}

И вам пора.

0 голосов
/ 24 октября 2018

Я покажу вам полный ответ здесь.

Сначала преобразуйте текст ответа в соответствующие данные JSON.

Во-вторых, создайте настраиваемую структуру для декодирования данных JSON в.

Третья сортировка структуры

Последняя для печати обратно к исходному тексту ответа (Вы можете использовать строку, чтобы получить результат печати.)

Первая:

            let json = """
    [
        "1234": {
            "startDate": "1536278400",
            "endDate": "1536796800",
            "playerRank": 4,
            "performance": 100,
            "isProfit": false,
            "members": 1
        },
        "adityaKumar": {
            "startDate": "1536364800",
            "endDate": "1540080000",
            "playerRank": 2,
            "performance": 100,
            "isProfit": false,
            "members": 6
        },
        "madhu60": {
            "startDate": "1539388800",
            "endDate": "1539475200",
            "playerRank": 1,
            "performance": 100,
            "isProfit": false,
            "members": 2
        }
    ]
    """.replacingOccurrences(of: "[", with: "{").replacingOccurrences(of: "]", with: "}").data(using: .utf8)

секунда:

    struct Response  {
     struct ResponseData  {
        let name : String
         let startDate : String
         let endDate : String
         let performance : Int
         let playerRank : Int
         let isProfit : Bool
         let members : Int
        }
        var responseData: [ResponseData]
        init (responseData: [ResponseData] = []){
            self.responseData = responseData
        }
    }

     extension Response: Decodable {

        struct DataKey: CodingKey {
                    var stringValue: String
                    init?(stringValue: String) {
                        self.stringValue = stringValue
                    }
                    var intValue: Int? { return nil }
                    init?(intValue: Int) { return nil}

                    static let startDate = DataKey(stringValue: "startDate")!
                    static let endDate = DataKey(stringValue: "endDate")!
                    static let performance = DataKey(stringValue: "performance")!
                    static let playerRank = DataKey(stringValue: "playerRank")!
                    static let isProfit = DataKey(stringValue: "isProfit")!
                    static let members = DataKey(stringValue: "members")!
                }

        public init(from decoder: Decoder) throws {
            var responseData = [ResponseData]()
            let container = try decoder.container(keyedBy: DataKey.self)
            for key in container.allKeys {
                let dataContainer = try container.nestedContainer(keyedBy: DataKey.self, forKey: key)

                let startDate = try dataContainer.decode(String.self, forKey: .startDate)
                 let endDate = try dataContainer.decode(String.self, forKey: .endDate)
                 let performance = try dataContainer.decode(Int.self, forKey: .performance)
                 let playerRank = try dataContainer.decode(Int.self, forKey: .playerRank)
                 let isProfit = try dataContainer.decode(Bool.self, forKey: .isProfit)
                 let members = try dataContainer.decode(Int.self, forKey: .members)
                let each = ResponseData.init(name: key.stringValue, startDate: startDate, endDate: endDate, performance: performance, playerRank: playerRank, isProfit: isProfit, members: members)
                responseData.append(each)
            }
            self.init(responseData: responseData)
        }
    }

    let decoder = JSONDecoder()
    var decodedStore = try decoder.decode(Response.self, from: json!)

третий:

      decodedStore.responseData.sort{$0.playerRank < $1.playerRank }

последний:

     print ("[")
    for each in decodedStore.responseData {
        print ("""
               \(each.name): {
                        "startDate": \(each.startDate),
                        "endDate": \(each.endDate),
                        "playerRank": \(each.playerRank),
                        "performance": \(each.performance),
                        "isProfit": \(each.isProfit),
                        "members": \(each.members)
                        }
            """)
    }
    print ("]\n")
0 голосов
/ 24 октября 2018

Словарь не отсортирован

Из документация swift

Словарь хранит ассоциации между ключами одного типа и значениями того же типа в коллекциибез определенного порядка.

Однако вы можете использовать метод .sorted в вашем словаре, который даст вам массив словарей (массивы сортируются).

let sorted = dictionary.sorted(by: { ($0.value["playerRank"]) < ($1.value["playerRank"]) })

Из вашего исходного примера sorted может выглядеть так

[
    (
      "key": "madhu60",
      "value": {
         "startDate": "1539388800",
         "endDate": "1539475200",
         "playerRank": 1,
         "performance": 100,
         "isProfit": false,
         "members": 2
      }
   )
   ....
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...