对具有一个公共属性的两种完全不同类型的数组进行排序



Hi我有两个属性不同的数组,只有属性有共同的sort_order,我想合并这两个数组,并按sort_order对这两个阵列排序。

这是代码:

var array1:[AnyObject] = [{
"name":"obj1Array1"
"sort_order": 4
"type":"G"
},{
"name":"obj2Array1"
"sort_order": 1
"type":"G"
},{
"name":"obj31Array1"
"sort_order": 5
"type":"G"
}]
var array2:[AnyObject] = [{
"Group":"M"
"sort_order": 3
"type":"G"
},{
"Group":"C"
"sort_order": 2
"type":"G"
},{
"Group":"D"
"sort_order": 6
"type":"G"
}]

啊,我想,在Objective-C时代,我们本可以使用排序谓词。好吧,那些日子已经过去了,协议是斯威夫特新政府的部长们。

让我们看看在这种情况下协议可以做什么
您可以定义一个以sort_order为属性的协议。此协议需要由您的两种对象类型(下面代码中的A和B。此外,使它们可编码以实现更多的协议魔术(来实现
然后您可以创建一个Ordered类型的合并数组,并对该数组使用排序函数。

protocol Ordered {
var sort_order:Int{get}
}
struct A:Codable, Ordered {
let name:String
let sort_order:Int
let type:String
}
struct B:Codable, Ordered {
let Group:String
let sort_order:Int
let type:String
}
var array1:[A] = []
var array2:[B] = []
var mergedArray:[Ordered] = array1
for item in array2 {
mergedArray.append(item)
}
mergedArray.sort { (A, B) -> Bool in
return A.sort_order < B.sort_order
}

使用此

var array1 : [[String : Any]] = [[  "name" : "obj1Array1", "sort_order" : 4, "type":"G" ],
[ "name":"obj2Array1","sort_order": 1,"type":"G"],
["name":"obj31Array1","sort_order": 5,"type":"G"]]
var array2 : [[String : Any]] = [[ "Group":"M", "sort_order": 3,"type":"G"],
["Group":"C", "sort_order": 2,"type":"G"],
["Group":"D","sort_order": 6,"type":"G"]]

let newArr = [array1, array2].flatMap({$0}).sorted(by: { ($0["sort_order"] as! Int) < ($1["sort_order"] as! Int) })

以下是如何使用swift 4-

var array1: [[String: Any]] = [
["name": "obj1Array1", "sort_order": 4, "type": "G"],
["name": "obj2Array1", "sort_order": 1, "type": "G"],
["name": "obj3Array1", "sort_order": 5, "type": "G"]
]
var array2: [[String: Any]] = [
["Group": "M", "sort_order": 3, "type": "G"],
["Group": "C", "sort_order": 2, "type": "G"],
["Group": "D", "sort_order": 6, "type": "G"]
]
let mergedArray = array1 + array2
let sortedAndMerged = mergedArray.sorted{ ($0["sort_order"] as! Int) < ($1["sort_order"] as! Int) }
print(sortedAndMerged)
// prints [["type": "G", "name": "obj2Array1", "sort_order": 1], ["Group": "C", "sort_order": 2, "type": "G"], ["Group": "M", "sort_order": 3, "type": "G"], ["type": "G", "name": "obj1Array1", "sort_order": 4], ["type": "G", "name": "obj3Array1", "sort_order": 5], ["Group": "D", "sort_order": 6, "type": "G"]]

你可以试试这个

let array1: [[String:Any]] = [ [
"name":"obj1Array1",
"sort_order": 4,
"type":"G"
],
[
"name":"obj2Array1",
"sort_order":1,
"type":"G"
],
[
"name":"obj31Array1",
"sort_order":5,
"type":"G"
]]
let array2: [[String:Any]] = [ [
"Group":"M",
"sort_order": 3,
"type":"G"
],
[
"Group":"C",
"sort_order": 2,
"type":"G"
],
[
"Group":"D",
"sort_order": 6,
"type":"G"
]
]
var new = array1 + array2
new = new.sorted{
($0["sort_order"] as! Int) < ($1["sort_order"] as! Int)
}
print(new)

最新更新