如何重新创建属于字母的字典数组?

时间:2016-10-26 15:48:43

标签: arrays dictionary swift3

我正在尝试使用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)

1 个答案:

答案 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
  }
}