กรองอาร์เรย์ของออบเจ็กต์แบบกำหนดเองพร้อมแอตทริบิวต์และแผนที่ใน Swift

คลาสโมเดลของฉันเป็นดังนี้:

struct Job: Decodable, Equatable, Hashable {
   var id: Int?
   var status: String?
   var priority: String?
}

ฉันมีวัตถุ 2 อาร์เรย์ (งาน) เป็น:

 var jobModel = [Job]()
 var filteredJobModel = [Job]()

ตัวพิมพ์ : jobModel มี 5 องค์ประกอบ filteredJobModel มี 2 องค์ประกอบ (เซตย่อยของ jobModel) ใน filteredJobModel ค่าสำหรับ status สำหรับทั้งสองอ็อบเจ็กต์มีการเปลี่ยนแปลงโดยการดำเนินการ search ฉันต้องการอัปเดต jobModel กลับด้วย filteredJobModel โดยที่วัตถุตรงกับแอตทริบิวต์ id

มีวิธีใดบ้างที่ฉันสามารถบรรลุผลในกรณีนี้? ฉันจะสามารถใช้ ตัวกรอง & แผนที่ สำหรับ [String] ได้ แต่ฉันต้องการทราบวิธีใช้ฟังก์ชันลำดับที่สูงกว่าสำหรับอาร์เรย์ของวัตถุที่กำหนดเอง


person Alen Alexander    schedule 28.11.2019    source แหล่งที่มา


คำตอบ (1)


for (index, job) in idsJobModel.enumerated() {
    if let match = arrFiltetered.first( where: {job.id == $0.id} ) {
     idsJobModel[index] = match
   }
}

หรือหากคุณต้องการใช้แผนที่:

idsJobModel = idsJobModel.map {
    let myID = $0.id
    if let match = arrFiltetered.first( where: {myID == $0.id} ) {
        return match
    } else {
        return $0
    }
}

โค้ดข้างต้นเวอร์ชันใดเวอร์ชันหนึ่งจะมีประสิทธิภาพ O(n²) ดังนั้นโค้ดจะช้าลง อย่างมาก เมื่ออาร์เรย์ของคุณมีองค์ประกอบขนาดใหญ่กว่า 30 องค์ประกอบ จะต้องมีการปรับแต่งเพื่อให้ทำงานได้ดีกับอาร์เรย์ขนาดใหญ่

person Duncan C    schedule 28.11.2019
comment
สมมติว่าค่า id ใน idsJobModel นั้นไม่ซ้ำกันเสมอ (และไม่เคยมีค่าเลย) คุณสามารถปรับปรุงประสิทธิภาพข้างต้นได้โดยการแมปอาร์เรย์ arrFiltetered ลงในพจนานุกรมโดยใช้ id เป็นคีย์ จากนั้นคุณจะต้องวนซ้ำ idsJobModel ทำการค้นหาพจนานุกรมของแต่ละ ID และแทนที่รายการใน idsJobModel หากพบข้างต้น (การค้นหาพจนานุกรมเกือบจะ O(1) ดังนั้นจะปรับปรุงประสิทธิภาพของคุณเป็นประมาณ O(n) ซึ่งเป็นการปรับปรุงอย่างมาก - person Duncan C; 28.11.2019
comment
แม้ว่าค่า ID ของคุณจะไม่ซ้ำกัน คุณก็สามารถใช้ฟังก์ชันแฮชแบบกำหนดเองที่ไม่รวมคุณสมบัติสถานะ (เปลี่ยนแปลงได้) ของคุณ และใช้แฮชเป็นคีย์พจนานุกรมในการเพิ่มประสิทธิภาพความเร็วข้างต้น - person Duncan C; 28.11.2019