Свести массив массивов словарей, принимая только значения - PullRequest
0 голосов
/ 26 октября 2019

У меня есть такая структура массива:

[
    [
        keyA: value1,
        keyB: value2
    ],
    [
        keyA: value3, 
        keyB: value4
    ],
    [
        keyA: value5, 
        keyB: value6
    ]
]

И чего я хочу добиться - это упорядочить массив в один словарь, например:

[value1: value2, value3: value4]

Вероятно, для достижения этого используется слияниедважды? Я пытался с:

arrayToFlatten.reduce([:]) { $0.merging($1) { (current, _) in current } }

, но я не получил ожидаемый результат:

[
    [keyA: value1],
    [keyB: value2]
]

Эта структура получена из файла plist:

plist file

1 Ответ

1 голос
/ 26 октября 2019

Если я правильно понимаю этот вопрос, я думаю, что это то, что вы ищете

let source = [
    [
        "code": "DZ",
        "name": "ALGERIA",
    ],
    [
        "code": "AS",
        "name": "AMERICAN SAMOA",
    ],
    [
        "code": "AO",
        "name": "ANGOLA",
    ],
]

let result = Dictionary(uniqueKeysWithValues: source.lazy.map { dict in
    return (key: dict["code"]!, value: dict["name"]!)
})

print(result) // => ["AO": "ANGOLA", "AS": "AMERICAN SAMOA", "DZ": "ALGERIA"]

Слияние словарей не было подходящим инструментом для работы. Он взял бы диктовку, слил ее со вторым, имеющим те же ключи. Согласно закрытию, которое вы дали, когда два ключа сталкиваются, оно должно принимать старое значение, а не то, которое пытается объединиться. Таким образом, объединение второго dict не имеет никакого эффекта. Точно так же третий не имел никакого эффекта, либо. Вам следует прочитать документацию .

Надеюсь, сегодня вы узнали о важности минимального воспроизводимого примера и четкого вопроса. Если бы вы только что сказали «вот мои исходные данные, вот ожидаемый результат», то на такой вопрос можно было бы ответить за несколько секунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...