Swift-修剪并映射数组中的第一个字母

问题描述

我有一个列表,其中包含> 2500个客户端名称,并且想要创建一个姓氏字母索引(姓氏的第一个字母)。 当LastName前面有空白(我知道,旧数据问题应在以后修复)时,应将其删除。如果没有可用的姓氏,则它应作为indexArrayro中的最后一项出现。

结果应为 indexArray == [[“ A”,“ G”,“ I”,“ M”,“ S”,“ Z”,“”]大写。

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

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: ""),lastName: "StrawBerry"),nil,lastName: "zwordfish"),lastName: "Zwordfish"),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)
}

对裁切有帮助吗? 我以为可以在

旁边使用它
arrayWithNoNils.map({ $0.lastName.prefix(1) })

类似

arrayWithNoNils.map({ $0.lastName.trim.prefix(1) })

对此有何建议?

一如既往的谢谢。

解决方法

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

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
    })
,

您可以尝试以下操作:

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",""]
,

这是您要找的吗?

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))
})
,

我找到了,

该行应该变成

let indexedArray = arrayWithNoNils.map({ (($0.lastName.trim)().uppercased()).prefix(1)