首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速修剪和映射数组中的第一个字母

快速修剪和映射数组中的第一个字母
EN

Stack Overflow用户
提问于 2020-08-29 16:16:11
回答 4查看 68关注 0票数 0

我有一个>2500个客户姓名的列表,并希望创建一个按字母顺序排列的lastNames索引(姓氏的第一个字母)。当LastName前面有空格时(我知道遗留数据问题,以后应该会修复),它们应该被删除。如果没有可用的LastName,那么它应该作为indexArrayro中的最后一项出现。

结果应为大写的indexArray == "A“、"G”、"I“、"M”、"S“、"Z”、"“。

这就是我到目前为止所得到的。

代码语言:javascript
复制
struct MyObject {
    let firstName: String
    let lastName : String
}

let objectArray : [MyObject?] = [
    MyObject(firstName: "piet", lastName: "mozilla"),
    MyObject(firstName: "jol", lastName: " godzilla"),
    MyObject(firstName: "", lastName: "Anubis"),
    MyObject(firstName: "paul", lastName: ""),
    MyObject(firstName: "", lastName: "Strawberry"),
    nil,
    MyObject(firstName: "jol", lastName: "zwordfish"),
    MyObject(firstName: "jol", lastName: ""),
    MyObject(firstName: "", lastName: "Zwordfish"),
    nil,
    MyObject(firstName: "pot", lastName: "IronFly")
]


extension Array {  
    mutating func rearrange(from: Int, to: Int) {
        insert(remove(at: from), at: to)
    }
}

extension String
{   
    func trim() -> String
    {
        return self.trimmingCharacters(in: .whitespaces)
    }
}

let arrayWithNoNils = objectArray.flatMap { $0 } // to remove the 'nil's

let indexedArray = arrayWithNoNils.map({ $0.lastName.prefix(1) }) // get the first character

var indexArr : Array = Set(indexedArray).sorted() as Array // make it unique and sort

if indexArr.count > 0 && indexArr[0] == "" { // move the empty one as last
    let cnt = indexArr.count - 1
    indexArr.rearrange(from: 0, to: cnt)
}

在修剪方面有什么帮助吗?我想我可以把它用在

代码语言:javascript
复制
arrayWithNoNils.map({ $0.lastName.prefix(1) })

像这样的东西

代码语言:javascript
复制
arrayWithNoNils.map({ $0.lastName.trim.prefix(1) })

对此有什么建议吗?

一如既往的谢谢你。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-08-29 17:14:35

这将通过使用compactMap删除nil对象并修剪和获取姓氏的第一个字符来为您提供索引数组。然后将其转换为一个集合以删除重复项,最后进行排序,其中闭包确保"“排在最后

代码语言:javascript
复制
let indexArray = Set(objectArray
    .compactMap { $0?.lastName.trimmingCharacters(in: .whitespaces).prefix(1).uppercased()})
    .sorted(by: {
        if $0.isEmpty {
            return false
        }
        if $1.isEmpty {
            return true
        }
        return $0 < $1
    })
票数 1
EN

Stack Overflow用户

发布于 2020-08-29 17:15:46

您可以尝试以下操作:

代码语言:javascript
复制
let firstLetters = objectArray.map { item -> String in
    guard let item = item else { return "" }
    return String(item.lastName.trim().prefix(1)).uppercased()
}

let indexArray = Array(Dictionary(grouping: firstLetters, by: { $0 }).keys)
    .sorted {
        if $0 == "" { return false }
        if $1 == "" { return true }
        return $0 < $1
    }

print(indexArray) // ["A", "G", "I", "M", "S", "Z", ""]
票数 1
EN

Stack Overflow用户

发布于 2020-08-29 16:29:29

这是你要找的吗?

代码语言:javascript
复制
let fixedArray = objectArray.map({ (object) -> MyObject? in
    guard let existedObject = object else { return nil }
    return MyObject(firstName: existedObject.firstName, lastName: existedObject.lastName.trimmingCharacters(in: .whitespacesAndNewlines))
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63644872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档