简体   繁体   English

从包含字符串数组的对象元素中过滤结构对象

[英]filter struct objects from object element containing array of string

I have defined a struct as follows : 我定义了一个结构如下:

struct ECUnifiedStructure{

var contactName             : String!
var contactNumber           = [String]()
...
...

init(contact: CNContact , EProfile : Bool) {
    let validTypes = [
        CNLabelPhoneNumberiPhone,
        CNLabelPhoneNumberMobile,
        CNLabelPhoneNumberMain,
        CNLabelHome,
        CNLabelWork
    ]

    var givenName           = contact.givenName + " " + contact.middleName
    let familyName          = contact.familyName
    if (givenName == "" && familyName == "") || givenName == " "{
        givenName           = contact.organizationName
    }

    self.contactName = givenName.capitalized + familyName.capitalized
    self.contactNumber = contact.phoneNumbers.compactMap({ (PhoneNumber) -> String? in
        if let phoneLabel  = PhoneNumber.label , validTypes.contains(phoneLabel){
            return PhoneNumber.value.stringValue.replacingOccurrences(of: " ", with: "").replacingOccurrences(of: "-", with: "")
        }
        return nil
    })
....
....
....
}}

Problem Statement : Need to filter an array of ECUnifiedStructure (ie . [ECUnifiedStructure]) based upon name and phone Number(check both substring and string as whole). 问题陈述:需要根据名称和电话号码过滤ECUnifiedStructure数组(即[ECUnifiedStructure])(检查子字符串和整个字符串)。

Current Implementation : The following is the current implementation I have done. 当前的实现:以下是我已经完成的当前实现。 Here both contacts and filter contacts are [ECUnifiedStructure]. 此处,触点和过滤器触点均为[ECUnifiedStructure]。

self.filterContacts = self.contacts.filter {($0.contactName).range(of: textString, options: [ .caseInsensitive, .diacriticInsensitive ]) != nil} + self.contacts.filter {($0.contactNumber.compactMap {$0}.contains(textString))}

Issues with implementation : Getting result for filtering contact name as intended with results including both string as whole and substrings but 实施问题:获取结果以按预期过滤联系人姓名,结果包括整个字符串和子字符串,但

when filtering phone number , result for substrings not found . 筛选电话号码时, 找不到 子字符串的结果 Only when we give whole phone number does the result turn up. 只有当我们提供完整的电话号码时,结果才会出现。

Probable cause : 可能的原因 :

self.contacts.filter {($0.contactNumber.compactMap {$0}.contains(textString))}

Eg : Suppose contacts = [[name: "David" , phoneNumber : ["1234567890",9876543210]], [name: "Hilton" , phoneNumber : ["1011111111","2222222222"]] , [name: "lewis" , phoneNumber : ["1111111111","2222222222"]]] 例如:假设联系人= [[名称:“ David”,电话号码:[“ 1234567890”,9876543210]],[名称:“希尔顿”,电话号码:[“ 1011111111”,“ 2222222222”]],[名称:“刘易斯” ,phoneNumber:[“ 1111111111”,“ 2222222222”]]]

searchString = "10" searchString =“ 10”

intended result = [[name: "David" , phoneNumber : ["1234567890",9876543210]], [name: "Hilton" , phoneNumber : ["1011111111","2222222222"]]] 预期结果= [[名称:“ David”,电话号码:[“ 1234567890”,9876543210]],[名称:“希尔顿”,电话号码:[“ 1011111111”,“ 2222222222”]]

current Result = empty. 当前结果=空。

Please propose an elegant way of doing it.If you can please point out what I did wrong . 请提出一种优雅的方法。如果能请指出我做错了。 Thanks in advance. 提前致谢。

This will return any struct object that has a phonenumber containing "10" 这将返回电话号码包含“ 10”的任何结构对象

let result = contacts.filter{ $0.phoneNumber.contains(where: { $0.contains("10")}) }

Using your original filter code 使用原始过滤器代码

self.filterContacts = self.contacts.filter {($0.contactName).range(of: textString, options: [ .caseInsensitive, .diacriticInsensitive ]) != nil} + self.contacts.filter { $0.contactNumber.contains(where: {$0.contains(textString)})}

Here is my complete test code 这是我完整的测试代码

struct ECUnifiedStructure{
    var name          : String!
    var phoneNumber   = [String]()
}

let contacts:[ECUnifiedStructure] = [ECUnifiedStructure(name: "David" , phoneNumber : ["1234567890","9876543210"]), 
     ECUnifiedStructure(name: "Hilton" , phoneNumber : ["1011111111","2222222222"]) , 
     ECUnifiedStructure(name: "lewis" , phoneNumber : ["1111111111","2222222222"])]

let result = contacts.filter{ $0.phoneNumber.contains(where: { $0.contains("10")}) }

for r in result {
    print(r)
}

output 产量

ECUnifiedStructure(name: Optional("David"), phoneNumber: ["1234567890", "9876543210"])
ECUnifiedStructure(name: Optional("Hilton"), phoneNumber: ["1011111111", "2222222222"])

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM