Как я могу объединить 2 словаря в один массив? - PullRequest
0 голосов
/ 14 февраля 2020

Мои JSON данные выглядят как это изображение ниже. Теперь я хочу объединить value Типа магазина и Промоакции в один для использования в качестве данных представления коллекции. Как я могу это сделать?

Я просто фильтрую данные ответов с сервера следующим образом:

        var dataBanDau: [SDFilterModel] = []
        var quickData: [SDFilterModel] = []

        let filters: [SDFilterModel] = data

        self.filterEntries = filters

        //let nsarray = NSArray(array: self.filterEntries! , copyItems: true)
//            self.filterEntriesStoreConstant = nsarray as! Array

        self.dataBanDau = filters

        for i in 0..<self.dataBanDau.count {
            if self.dataBanDau[i].search_key.count == 0 {
                self.quickData.append(self.dataBanDau[i])
            }
        }

        self.quickData = self.quickData.filter {
            $0.type != "range"
        }

        DispatchQueue.main.async {
            //Note: Reload TableView
            self.quickFilterCollection.reloadData()
            completed(true)
        }
    }

класс SDFilterModel:

class SDFilterModel: DSBaseModel {
    var name = String()
    var type = String()
    var is_expanded = Int()
    var search_key = String()
    var filterEntries : [SDFilterModel]?

    override func copy(with zone: NSZone? = nil) -> Any {
        // This is the reason why `init(_ model: GameModel)`
        // must be required, because `GameModel` is not `final`.
        let copy = SDFilterModel(dict: self.dictionary)

        if let arrAttribute = NSArray(array: self.value , copyItems: true) as? [AttributeValueModel] {
            copy.value = arrAttribute
        }

        return copy
    }

    override init(dict: Dictionary<String, Any>) {
        super.init(dict: dict);
        value = self.valueParse()

        name = dict.getString(forKey: "name")
        type = dict.getString(forKey: "type")
        search_key = dict.getString(forKey: "search_key")
        is_expanded = dict.getInt(forKey: "is_expanded")!
    }


    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    var value: [AttributeValueModel] = [];

    func valueParse()-> [AttributeValueModel] {
        guard let childs  = (self.dictionary["value"]) as? [Dictionary<String, AnyObject>]
            else { return [] }

        var output: [AttributeValueModel] = [];

        for  aDict in childs {
            let item = AttributeValueModel(dict:aDict);

//            if type == .Range  && item.option_id == "0" {
//                item.setRangeOptionID(aValue: item.option_name!)
//            }
//
            output.append(item);
        }

        return output;
    }

enter image description here

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Позвольте быть Предположим, у вас есть let myArray = [1,2,3,4,5,6,7,8]

Теперь вы хотите, чтобы квадрат каждого элемента в массиве,

С для l oop вы делаете это

for item in myArray {
    print(item * item) 
}

Теперь предположим, item = $0

С для map вы делаете

myArray.map({ $0 * $0 })

Оба будут давать одинаковый вывод.


map: Используется для выполнения одинаковых операций с каждым элементом массива.

flatmap: Используется для выравнивания массива массива.

let myArr = [[1,2,3],[4,5,6,7]]

и вы хотите o / p как [1,2,3,4,5,6,7]

Таким образом, вы можете получить вывод выше с myArr.flatMap({$0})


Теперь вернемся к вашему вопросу.

let reqArray = myModel.data.map({ $0.value }).flatMap({ $0 })

Во-первых, map дает вам массив-массив ключа value, но вам нужен один массив, поэтому для этого вам нужно использовать flatmap.


Вы можете взять ref: https://medium.com/@Dougly / функции высшего порядка в быстрой сортировке-сопоставлении-фильтра-редукции-dff60b5b6adf

0 голосов
/ 14 февраля 2020

Создайте модели, подобные этой

struct Option {
    let name: String
    let searchKey: String
    let id: String
}

struct Model {
    let type: String
    let name: String
    let isExpanded: Bool
    let value: [Option]
}

Вы должны получить значения options массива и объединить все массивы

let models:[Model] = //...
let collectionViewArray = models.map { $0.value }.reduce([Option](), +)

Используя for l oop

var collectionViewArray = [Option]()
for model  in models {
    collectionViewArray.append(contentsOf: model.value)
}
...