Swift - Trim 并映射数组中的第一个字母
Swift - Trim and map the first letter from a Array
我有一个包含 >2500 个客户姓名的列表,我想创建姓氏(姓氏的第一个字母)的字母索引。
当姓氏前面有空格时(我知道遗留数据问题稍后应该得到修复),它们应该被删除。如果没有可用的姓氏,那么它应该作为 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: ""),
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 { [=12=] } // to remove the 'nil's
let indexedArray = arrayWithNoNils.map({ [=12=].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)
}
对 Trim 有任何帮助吗?
我以为我可以在
旁边使用它
arrayWithNoNils.map({ [=13=].lastName.prefix(1) })
类似
arrayWithNoNils.map({ [=14=].lastName.trim.prefix(1) })
对此有什么建议吗?
一如既往的谢谢。
这是您要找的吗?
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))
})
这将通过使用 compactMap 删除 nil 对象并 trim 并获取姓氏的第一个字符来为您提供索引数组。然后将其转换为 Set 以删除重复项,并最终在闭包确保 "" 排在最后的位置进行排序
let indexArray = Set(objectArray
.compactMap { [=10=]?.lastName.trimmingCharacters(in: .whitespaces).prefix(1).uppercased()})
.sorted(by: {
if [=10=].isEmpty {
return false
}
if .isEmpty {
return true
}
return [=10=] <
})
您可以尝试以下方法:
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: { [=10=] }).keys)
.sorted {
if [=10=] == "" { return false }
if == "" { return true }
return [=10=] <
}
print(indexArray) // ["A", "G", "I", "M", "S", "Z", ""]
找到了,
该行应该变成
let indexedArray = arrayWithNoNils.map({ (([=10=].lastName.trim)().uppercased()).prefix(1)
我有一个包含 >2500 个客户姓名的列表,我想创建姓氏(姓氏的第一个字母)的字母索引。 当姓氏前面有空格时(我知道遗留数据问题稍后应该得到修复),它们应该被删除。如果没有可用的姓氏,那么它应该作为 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: ""),
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 { [=12=] } // to remove the 'nil's
let indexedArray = arrayWithNoNils.map({ [=12=].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)
}
对 Trim 有任何帮助吗? 我以为我可以在
旁边使用它arrayWithNoNils.map({ [=13=].lastName.prefix(1) })
类似
arrayWithNoNils.map({ [=14=].lastName.trim.prefix(1) })
对此有什么建议吗?
一如既往的谢谢。
这是您要找的吗?
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))
})
这将通过使用 compactMap 删除 nil 对象并 trim 并获取姓氏的第一个字符来为您提供索引数组。然后将其转换为 Set 以删除重复项,并最终在闭包确保 "" 排在最后的位置进行排序
let indexArray = Set(objectArray
.compactMap { [=10=]?.lastName.trimmingCharacters(in: .whitespaces).prefix(1).uppercased()})
.sorted(by: {
if [=10=].isEmpty {
return false
}
if .isEmpty {
return true
}
return [=10=] <
})
您可以尝试以下方法:
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: { [=10=] }).keys)
.sorted {
if [=10=] == "" { return false }
if == "" { return true }
return [=10=] <
}
print(indexArray) // ["A", "G", "I", "M", "S", "Z", ""]
找到了,
该行应该变成
let indexedArray = arrayWithNoNils.map({ (([=10=].lastName.trim)().uppercased()).prefix(1)