我正在尝试使用Swift 3中的对象从现有数组创建一个新的对象数组。所以我有一个字母数组,其中包含以该字母开头的对象(该对象的名称键),以便我可以为tableview
中的部分使用新的字典数组。我想要的是每个对象的每个名称键的第一个字母将被检查,而不是提取名称的第一个字母并将其存储为数组。
例如,字典包含“Lisa”之类的名称。第一个字母是L
,而且还不存在。它将为字母L
创建一个数组。检查下一个条目。如果下一个条目再次以L
开头,请将其添加到带有L
字母的数组中。如果下一个以S
开头,则创建一个新的S
数组并将其添加到该数组等等。
var names = [
[
"name" : "Lisa",
"street" : "Lorem ipsum"
],
[
"name" : "Jeffrey",
"street" : "Lorem ipsum"
],
[
"name" : "Arnold",
"street" : "Lorem ipsum"
],
[
"name" : "Jacob",
"street" : "Lorem ipsum"
],
[
"name" : "Sam",
"street" : "Lorem ipsum"
],
[
"name" : "Anita",
"street" : "Lorem ipsum"
],
[
"name" : "Lotte",
"street" : "Lorem ipsum"
]
]
func createArrarDic(array: [[String: String]]) -> [[String: String]] {
var result = [[String: String]]()
// Loop through array
for object in array {
for (key, value) in object {
let index = value.index(value.startIndex, offsetBy: 1)
let firstLetter = value.substring(to: index).uppercased()
print(firstLetter)
if result[firstLetter] != nil {
result[firstLetter]!.append(object)
} else {
result[firstLetter] = [object]
}
}
}
return result
}
createArrarDic(array: names)
我想出了上面的代码,但它会给我一个错误:
Cannot subscript a value of type '[[String : String]]' with an index of type 'String'
很明显我对结果声明做了一些错误,但无法弄清楚它应该如何。第一个字母的检查应该在对象中完成,但要重新排序并为每个字母创建一个新数组,不应该在该对象内完成,而是在它上面一层。
另外问题是for(key, value)
将检查该对象中的所有键/值对,我只需要“name”键。
有人可以帮助我吗?
更新
我来到以下代码。我有返回类型和返回值[String: [String: String]]()
因为它应该以包含引用它的对象的字母开头。
现在唯一的问题是我不知道如何将对象附加到特定字母的数组,因为.append
或+=
运算符不起作用。对此有何看法?
func createArrarDic(array: [[String: String]]) -> [String: [String: String]] {
var result = [String: [String: String]]()
// Loop through array
for object in array {
// Loop through dictionaries
for (_, value) in object {
let index = value.index(value.startIndex, offsetBy: 1)
let firstLetter = value.substring(to: index).uppercased()
print(firstLetter)
if result[firstLetter] != nil {
// Append
result[firstLetter]! += object
} else {
result[firstLetter] = object
}
}
}
return result
}
let changedArray = createArrarDic(array: names)
答案 0 :(得分:1)
我认为这可以做你想要的:
func createArrarDic(array: [[String: String]]) -> [String: [[String: String]]] {
return array.reduce([String: [[String: String]]]()) { result, object in
guard let name = object["name"] else {
return result
}
if name.characters.count == 0 {
return result
}
let firstLetter = String(name[name.startIndex]).uppercased()
var mutableResult = result
if mutableResult[firstLetter] == nil {
mutableResult[firstLetter] = [object]
} else {
mutableResult[firstLetter]?.append(object)
}
return mutableResult
}
}