【问题标题】:How can I merge 2 dictionaries into one array?如何将 2 个字典合并到一个数组中?
【发布时间】:2020-05-30 04:21:55
【问题描述】:

我的 JSON 数据如下图所示。现在我想将 Shop Type 和 Promotion 的 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;
    }

【问题讨论】:

  • 显示你的模型结构/类
  • 你可以使用map
  • 研究地图功能,它可能会有所帮助,但可能解决方案是使用平面地图。
  • var filterEntries : [SDFilterModel]? 这不应该是SDFilterModel。为filterEntries 创建一个新的结构类型。检查我的答案
  • @Bad_Developer 只需这样做let reqArray = myModel.data.map({ $0.value }).flatMap({ $0 })。现在reArray 是单个数组中包含value 键的值。

标签: arrays swift dictionary merge swift5


【解决方案1】:

假设你有let myArray = [1,2,3,4,5,6,7,8]

现在你想对数组中的每个元素进行平方,

使用 for 循环你可以这样做

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

现在假设item = $0

ma​​p 你就可以了

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

两者都会给出相同的输出。


ma​​p : 用于对数组的每个元素执行相同的操作。

flatmap : 用于对array的数组进行展平。

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.


您可以参考:https://medium.com/@Dougly/higher-order-functions-in-swift-sorted-map-filter-reduce-dff60b5b6adf

【讨论】:

    【解决方案2】:

    像这样创建模型

    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 循环

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

    【讨论】:

    • 你为什么使用reduce ??
    • 我想,Apple Doc 说点别的。
    • 你忘了过滤
    • @dahiya_boy 我们也可以使用reduce[1,2].reduce(0,+)3。而[[1],[2]].reduce([Int](),+) 给了[1,2]
    • 仔细阅读问题,OP只想要匹配两个不同值的键的值。
    猜你喜欢
    • 2021-05-27
    • 2021-12-07
    • 2015-11-15
    • 2020-11-13
    • 2017-01-04
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 2015-07-26
    相关资源
    最近更新 更多