Свойство Swift Deep Flatten Array [дубликат]

У меня была такая же проблема, и я не мог понять, что ее вызывает. Недавно я преобразовал свои HTML-файлы с японского на UTF-8, но я ничего не делал с файлами сценариев. Как-то jquery-1.10.2.min.js был поврежден в этом процессе (я до сих пор не знаю, как). Замена jquery-1.10.2.min.js оригиналом исправил его.

2
задан Ces 13 April 2016 в 17:33
поделиться

2 ответа

Один подход к выравниванию рекурсивной структуры класса с рекурсивной функцией.

Вот класс, который мы хотели бы сгладить:

public class Nested {
    public let n : Int
    public let sub : [Nested]?
    public init(_ n:Int, _ sub:[Nested]?) {
        self.n = n
        self.sub = sub
    }
}

Вот функция, которая демонстрирует как это можно сделать:

func test() {
    let h = [
        Nested(1, [Nested(2, nil), Nested(3, nil)])
    ,   Nested(4, nil)
    ,   Nested(5, [Nested(6, nil), Nested(7, [Nested(8, nil), Nested(9, nil)])])
    ]
    func recursiveFlat(next:Nested) -> [Nested] {
        var res = [Nested]()
        res.append(next)
        if let subArray = next.sub {
            res.appendContentsOf(subArray.flatMap({ (item) -> [Nested] in
                recursiveFlat(item)
            }))
        }
        return res
    }
    for item in h.flatMap(recursiveFlat) {
        print(item.n)
    }
}

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

2
ответ дан dasblinkenlight 25 August 2018 в 03:30
поделиться

Во-первых, я настоятельно рекомендую сделать тип subObjects не факультативным. В редких случаях для факультативных массивов нет причин. Действительно ли вам нужно различать «no array» и «empty array?»? Это очень редко. Если вы сделаете subObjects просто массивом, вы можете написать то, что вы описываете как простую рекурсивную функцию:

func flattenMyObjects(myObjects: [MyObject]) -> [MyObject] {
    return myObjects.flatMap { (myObject) -> [MyObject] in
        var result = [myObject]
        result.appendContentsOf(flattenMyObjects(myObject.subObjects))
        return result
    }
}

Если вам нужно, чтобы это было необязательным, изменения были незначительными (вы " вам нужно добавить if-let или что-то подобное).

4
ответ дан Rob Napier 25 August 2018 в 03:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: