对比两个套餐对象,套了九层循环,有什么好的优化方法?
如题,要对比两个列表,列表里面是商品套餐对象,套餐里面有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,
白鞋
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
比这个循环长的我见过,写的那个人就是以前组长
,他估计到现在也没有优化,,,,使用 ES5 内置数组函数 + 箭头函数隐藏 for 循环细节
提取重复的数组比对逻辑
已经省去里很多迭代的下角标处理里,但是代码还是很啰嗦,频繁重复对两个数组进行元素比较。干脆把这个逻辑提取出来:
传入两个数组,对数组元素的每个元素使用 identifier 获取 id,如果比较成功,则调用 process 函数处理这两个元素。例子中 identifier 都一样,即
item => item.id
.消除重复调用
目前代码中还存在重复地调用
match
函数,调用逻辑相似而重复,如果能把这块抽出来就好了。我们再提取一个函数,用来构造processXXX
。processAttr
比较特殊,对两边取子属性的逻辑不一样,所以提取的这个函数需要考虑processAttr
的需求。最后一步调用其实等价于:
把掉套函数调用拉平试试?试想如下代码:
于是有:
虽然调用的时候挺漂亮的,但是有点绕。。。
把对比方法封装到对象里。
比如:
组长没砍死你的话,让他写.没法优化就这样吧.
能力不够,等待大神来优化!
不过可以先优化细节,比如保存
arr[i]
,缓存length
等