2016-02-24 16 views
10

に辞書の配列を平らにし、私は1つの辞書に辞書の配列を平らにしようとしています すなわちスウィフトは:1つの辞書スウィフトで

私はflatmapを使用してみましたが
let arrayOfDictionaries = [["key1": "value1"], ["key2": "value2"], ["key3": "value3", "key4": "value4"]] 


//the end result will be: 
flattenedArray = ["key1": "value1", "key2": "value2", "key3": "value3", "key4": "value4"] 

が、返される結果のタイプ

    [(String, AnyObject)]なく [String, Object]は、だから私は2つの質問がある

    let flattenedArray = arrayOfDictionaries.flatMap { $0 } 
    // type is [(String, AnyObject)] 
    

    ある。すなわち210
  • 型[(String、AnyObject)]が返されるのはなぜですか?角かっこは何を意味しますか?

  • 希望する結果を得るにはどうすればよいですか?

編集:私は等の削減/スウィフトのマップ/ flatmapで機能的なアプローチを使用することを好むの代わりに、ここでは、forループ

答えて

10

括弧は何を意味していますか?

これは、コロンの代わりにカンマとともに、最初の手がかりを提供する必要があります。角かっこは、タプルの配列を取得することを意味します。あなたは辞書ではなく、配列を探しているので、これはあなたが、単一の辞書にタプル(キーと値のペア)の配列を変換する必要があることを示しています。

どのようにして所望の結果を達成するのですか?

、それはこのように、reduceを使用されるだろう行う一つの方法:スウィフト3.

ため

let flattenedDictionary = arrayOfDictionaries 
    .flatMap { $0 } 
    .reduce([String:String]()) { (var dict, tuple) in 
     dict.updateValue(tuple.1, forKey: tuple.0) 
     return dict 
    } 
+0

あなたは少し間違いを犯してしまった:)修正を確認してください。 –

+0

ここに問題がありました。 "dict.updateValue .0、forKey:tuple.1) "dict.updateValue(tuple.1、forKey:tuple.0)に変更しました –

+0

@ O-mkarああ、ありがとう! – dasblinkenlight

1

let arrayOfDictionaries = [["key1": "value1"], ["key2": "value2"], ["key3": "value3", "key4": "value4"]] 
var dic = [String: String]() 
for item in arrayOfDictionaries { 
    for (kind, value) in item { 
     print(kind) 
     dic.updateValue(value, forKey: kind) 
    } 


} 
print(dic) 

print(dic["key1"]!) 
を行う方法であります

OUTPUT

OUTPUT

+0

感謝。このアプローチは正しいが、スウィフトのマップ/フラットマップ/リダクションなどの機能的なアプローチを使用することを好むだろう。 – Lneuner

3

更新する@ dasblinkenlightの答えはパラメータの "varが" 非推奨が、このされましたアプローチは私のためにうまくいった。スイフト4、Dictionay

let flattenedDictionary = arrayOfDictionaries 
    .flatMap { $0 } 
    .reduce([String:String]()) { (dict, tuple) in 
     var nextDict = dict 
     nextDict.updateValue(tuple.1, forKey: tuple.0) 
     return nextDict 
    } 
+1

nextDictは、 ''辞書 'の代わりに'(Key、Value) 'タプルのシーケンスからの初期化のために組み立てられた理由はありませんか? – Wismin

4

init(_:uniquingKeysWith:)イニシャライザを有しています。 init(_:uniquingKeysWith:)は、次の宣言を有する:

init<S>(_ keysAndValues: S, uniquingKeysWith combine: (Value, Value) throws -> Value) rethrows where S : Sequence, S.Element == (Key, Value) 

は、重複キーの値を決定するために結合クロージャを使用して、所与の配列内のキーと値のペアから新しい辞書を作成します。


次遊び場コードスニペットは、新しい辞書に辞書の配列をフラット化する方法を示しています。このため

let dictionaryArray = [["key1": "value1"], ["key1": "value5", "key2": "value2"], ["key3": "value3"]] 

let tupleArray: [(String, String)] = dictionaryArray.flatMap { $0 } 
let dictonary = Dictionary(tupleArray, uniquingKeysWith: { (first, last) in last }) 

print(dictonary) // prints ["key2": "value2", "key3": "value3", "key1": "value5"] 
let dictionaryArray = [["key1": 10], ["key1": 10, "key2": 2], ["key3": 3]] 

let tupleArray: [(String, Int)] = dictionaryArray.flatMap { $0 } 
let dictonary = Dictionary(tupleArray, uniquingKeysWith: { (first, last) in first + last }) 
//let dictonary = Dictionary(tupleArray, uniquingKeysWith: +) // also works 

print(dictonary) // ["key2": 2, "key3": 3, "key1": 20] 
+0

これはあなたのコードに 'tupleArray'ステップを含めることを強制します。これは厄介なものです。 – pkamb