我有一个包含数据的数组,因为在通过firebase获取时,有时数据会以适当的顺序排列,而有些时间是随机的。因此,需要使用排序方法对本地数组进行排序
来自snapshot.value的反响:
Optional({
Images = {
"-KmRCabAyzoVNMD06Hpr" = {
UploadTime = 1497269431993;
imageUrl = "https://firebasestorage.googleapis.com/v0/b/mychat-1147d.appspot.com/o/Images%2FwRHmnmfu3CeqXa77YgHEWVXI1AI3%2F518962226641.jpg?alt=media&token=645878ac-1124-44b0-8203-75e94813ca76";
};
"-KmRCnYSsjJaZ3RINRDG" = {
UploadTime = 1497269484338;
imageUrl = "https://firebasestorage.googleapis.com/v0/b/mychat-1147d.appspot.com/o/Images%2FwRHmnmfu3CeqXa77YgHEWVXI1AI3%2F518962275721.jpg?alt=media&token=d0113b12-531c-48a5-838b-02f96396a6df";
};
"-KmRCweslwMPBt0aCBIc" = {
UploadTime = 1497269521676;
imageUrl = "https://firebasestorage.googleapis.com/v0/b/mychat-1147d.appspot.com/o/Images%2FwRHmnmfu3CeqXa77YgHEWVXI1AI3%2F518962317708.jpg?alt=media&token=e931d9b3-5635-4e2f-a597-2c60aa25b38d";
};
"-KmRD13t3pI21ci45LEv" = {
UploadTime = 1497269544342;
imageUrl = "https://firebasestorage.googleapis.com/v0/b/mychat-1147d.appspot.com/o/Images%2FwRHmnmfu3CeqXa77YgHEWVXI1AI3%2F518962340349.jpg?alt=media&token=a738df76-e00b-48c2-9983-1e902e285a5f";
};
"-KmRD6WfaNTgKaVhy_Iq" = {
UploadTime = 1497269566141;
imageUrl = "https://firebasestorage.googleapis.com/v0/b/mychat-1147d.appspot.com/o/Images%2FwRHmnmfu3CeqXa77YgHEWVXI1AI3%2F518962359997.jpg?alt=media&token=5828ee44-1721-4267-99d7-91f10381aa13";
};
"-KmREsVwMb4sY6yN4pNK" = {
UploadTime = 1497270028928;
imageUrl = "https://firebasestorage.googleapis.com/v0/b/mychat-1147d.appspot.com/o/Images%2FwRHmnmfu3CeqXa77YgHEWVXI1AI3%2F518962824146.jpg?alt=media&token=aa0383c7-7d26-4b7a-b9bb-dbb1da3cdfff";
};
};
UserInfo = {
UserID = wRHmnmfu3CeqXa77YgHEWVXI1AI3;
userName = "Aric D'sooza";
};
})
我需要根据UploadTime对此数组进行排序。
我试过这个:
let sortedArray = (myArray ).sorted(by: { (dictOne, dictTwo) -> Bool in
let d1 = dictOne["UploadTime"]! as! Double
let d2 = dictTwo["UploadTime"]! as! Double
return d1 < d2
})
print("Sorted Array - %@",sortedArray)
}
并尝试过:
self.sortedArray = (myArray as NSArray).sortedArray(using: [NSSortDescriptor(key: "UploadTime", ascending: true)]) as! [[String:AnyObject]]
答案 0 :(得分:1)
尝试以下代码:
var localArray : [[String : AnyObject]] = [[:]]
for dic in myArray{
localArray.append(dic)
}
let sortedArray = (localArray ).sorted(by: { (dictOne, dictTwo) -> Bool in
let d1 = dictOne["UploadTime"]! as! Double
let d2 = dictTwo["UploadTime"]! as! Double
return d1 < d2
})
print("Sorted Array - %@",sortedArray)
}
答案 1 :(得分:1)
试试这段代码,它对我有用。
func sortDictonary(aDataDict:[String:AnyObject]) ->[[String:Any]] {
let allKeys = Array(aDataDict.keys)
var arrImages = [[String:Any]] ()
for key in allKeys{
var aDict = aDataDict[key] as! [String:AnyObject]
let aTempData = ["uploadTime" :aDict["UploadTime"] as! Double,
"imageUrl":aDict["imageUrl"] as! String,
"AutoId": key] as [String : AnyObject]
// Here AutoID is unique key from your Response e.g. -KmREsVwMb4sY6yN4pNK
arrImages.append(aTempData)
}
return arrImages
}
调用此函数并将Images Dictionary
as,
var aDataDict = yourJSONResponse as! Dictionary<String,AnyObject>
var aDictUserInfo = aDataDict["UserInfo"] as!Dictionary<String,AnyObject>
let aDictImages = aDataDict["Images"] as! Dictionary<String,AnyObject>
let arrTempImages :[[String:Any]] = self.sortDictonary(aDataDict: aDictImages)
您将获得排序数组,
arrImagesData = (arrImagesData as NSArray).sortedArray(using: [NSSortDescriptor(key: "uploadTime", ascending: true)]) as! [[String:AnyObject]]
答案 2 :(得分:0)
您的Images
密钥的关联值是字典而非数组,字典本身无法排序。你有一些选择,包括:
"-KmRCabAyzoVNMD06Hpr"
)对您不重要,则将字典转换为数组,然后对该数组进行排序。您可以使用问题中的比较函数。UploadTime
密钥值对其进行排序。(2)可能听起来很复杂但你在问题和随后的评论中都有你需要的部分:
但是我们可以对字典进行排序:let sortedKeys = Array(dictionary.keys).sorted(&lt;)
这不会对字典进行排序,它会对字典的键进行排序。但是你不希望按照它们的值对键进行排序,而是根据它们所指的 - 元素词典 - 你已经按照这些行编写了一个函数,你只需要将它们结合起来:
let orderedKeys = Images.keys.sorted(by: { (keyOne, keyTwo) -> Bool in
let d1 = Images[keyOne]!["UploadTime"] as! Int
let d2 = Images[keyTwo]!["UploadTime"] as! Int
return d1 < d2
})
这会获取键(keyOne
),获取他们引用的词典(Images[keyOne]!
),以及您想要排序的词典中的值(["UploadTime"] as! Int
[我的测试数据包含整数] ),并对它们进行比较。
请注意,原始字典Images
根本没有排序;相反,你有一个集合orderedKeys
,它包含你想要处理字典中的值的顺序的键。要获得排序中的第一个元素,请使用orderedKeys
中的第一个键并使用它来索引Images
。
您可以使用orderedKeys
制作数组,或者只打印出值以便了解其工作情况:
for key in orderedKeys
{
print(Images[key] ?? "should never occur")
}
HTH