账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    对比两个套餐对象,套了九层循环,有什么好的优化方法?
    36
    0

    如题,要对比两个列表,列表里面是商品套餐对象,套餐里面有tag分类,分类里面有商品,商品中有不同的口味组,口味组中有不同的子口味,做了9个循环,怕被组长砍死,特来求助各路大神

    // 遍历第一组套餐
    for (var x = 0; x < packageInfoList.length;x++){
        // 拿到第二组中的的套餐
        var newPackage = ConfigData.getGoods(true, package.id);
        // 遍历第一组中的tag分类
        for (var y = 0; y < package.packageTag.length;y++){
            var oldTag = package.packageTag[y];
            for (var z = 0; z < newPackage.packageTag.length;z++){
                var newTag = newPackage.packageTag[z]; // 第二组中的tag分类
                if (package.packageTag.id == newPackage.packageTag.id){
                    // 遍历第一组的商品中的tag分类中的 商品
                    for (var m = 0; m < oldTag.goods.length;m++){
                         // 遍历第二组的商品中的tag分类中的 商品
                        for (var n = 0; n < newTag.goods.length;n++){
                            if (oldTag.goods[m].id === newTag.goods[n].id){
                                var flag = updateGoodAttr(oldTag.goods[m], newTag.goods[n])
                            }
                        }
                    }
                }
            }
        }
    }

    代码基本如上图

    [ // 套餐列表
        { // 套餐对象
           tag: [ // tag 分类列表
                { // tag对象
                    goods:[ // goods 列表
                        { // good 对象
                            attr: [ // 口味组列表(如辣度)
                                { // 口味组
                                    option:[ // 口味列表
                                        taste1: {},
                                        taste2: {},
                                        taste3: {},
                                        ......
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]

    列表数据结构如上
    而且方法updateGoodAttr中对比两个商品,也跑了4层的循环,加起来就9层了,有没有什么好的解决方案,
    由于每个属性都存在绑定关系(这个口味就是绑定到了这个商品,这个上商品就是绑定了这个套餐),所以不能把所有的口味taste提取出来对比,这样9层循环,到了后面毫无维护性,而且性能爆炸
    求助,来份神代码 揪揪 me,
    白鞋

    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 懸崖邊的愛 普通会员 1楼

      在Python中,如果一个套餐对象被多次套用九层循环,那么可能在某些情况下会导致性能问题。以下是一些优化方法:

      1. 使用生成器:生成器是一种特殊的迭代器,它可以在迭代过程中暂停,从而节省内存和提高效率。对于你的问题,你可以使用一个生成器来生成每个套餐对象的九层循环,而不是直接创建一个新的九层循环对象。这将允许你同时生成多个套餐对象,而不是一次性生成所有。

      python def create套餐(num): for _ in range(num): yield {'name': '套餐1', 'price': 10, 'quantity': 100}

      然后,你可以使用这个生成器来创建多个套餐对象:

      python 套餐1 = create套餐(9) 套餐2 = create套餐(9) 套餐3 = create套餐(9)

      1. 使用列表推导式:如果你的套餐对象都是一样的,你可以使用列表推导式来创建一个新的列表,其中包含每个套餐对象的九层循环。

      python 套餐_list = [create套餐(9) for _ in range(9)]

      1. 使用集合:如果你的套餐对象都是一样的,你可以使用集合来获取每个套餐对象的唯一ID,然后在循环中检查ID是否已经存在于列表中。如果存在,那么你可以跳过当前的套餐对象,否则继续循环。

      python 套餐_list = [create套餐(9) for _ in range(9)] seen = set() for i, obj in enumerate(套餐_list): if obj['id'] not in seen: seen.add(obj['id']) yield obj

      这些优化方法可以让你在大多数情况下提高套餐对象套用九层循环的效率。但是,如果你的套餐对象的结构或者行为不同,那么你可能需要根据具体情况进行调整。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部