近来在开发SKU模块的时候,遇到这样一个需求,某种商品有N(用未知数N来表示是因为规格的数组由用户制定且随时可以编辑的,所以对程序来说,它是一个未知数)类规格,每一类规格又有M个规格值,各种规格值的组合便是一个型号,比如说,颜色是商品规格的一类,可能的值有红、黄、绿、蓝,而尺码是另一类规格,可能的取值有L、M。那它们的规格组合数为:4*2 = 8,如果再另一类规格是版型,分别为修身和宽松,那就有4 * 2 * 2 = 16种组合了。怎样简单高效地求出这些组合呢?

这类问题首先考虑的方法是用递归,但返回之间并没有相互依赖的关系,到底什么时候结束是个问题,用嵌套的循环又会由于数组的维度及深度不得而知而变得困难重重,后来,想到了一种很可能并非性能最优,但简单直观的方法,写在这里与大家分享一下,如果你有更好的算法,请不吝赐教,小弟感激不尽。

刚开始的时候想到要从多个数组中依次抽取一个元素出来,感觉去进行深度遍历相当复杂,后来换了一种思路,其实每次只要把两个数组合并起来,然后把这两个数组合并的结果再与下个数组进行合并,最终,就能得出逐个抽取一个元素来进行组合的结果。这跟算组合总数的思路是一样的,也就是2*4*3,先是求出2*4=8,再用8*3=24;这样,24种组合的结果就得了,下面是JS代码,供大家参考一下,我知道这肯定并非最佳算法,所以,再次希望有其它解决办法的朋友赐教。

  1. function generateTrRow(specItemList){
  2. var specValueList = [];
  3. for(var i in specItemList){
  4. var s = specItemList[i];
  5. var arrValue = s.value.split(',');
  6. specValueList.push(arrValue);
  7. }
  8. var arrGroup = [], tempGroup = [];
  9. if(specValueList.length > ){
  10. var firstSpecValueList = specValueList[];
  11. for(var i in firstSpecValueList){
  12. tempGroup.push([firstSpecValueList[i]]);
  13. }
  14. specValueList.splice(, );
  15. arrGroup = generateGroup(specValueList, tempGroup);
  16. }
  17. }
  18. /**
  19. * 生成规格值组合的方法
  20. */
  21. function generateGroup(arrSpecValueList, tempGroup){
  22. for(var i in arrSpecValueList){
  23. var s = arrSpecValueList[i];
  24. var newTempGroup = [];
  25. for(var j in tempGroup){
  26. for(var k in s){
  27. var tempOne = [];
  28. for(var x in tempGroup[j]){
  29. tempOne.push(tempGroup[j][x]);
  30. }
  31. tempOne.push(s[k]);
  32. newTempGroup.push(tempOne);
  33. }
  34. }
  35. if(newTempGroup.length > ){
  36. tempGroup = newTempGroup;
  37. }
  38. }
  39. return tempGroup;
  40. }

  

其中generateTrRow方法是我生成表格中的行用到的,它主导把数组合并后删除已合并的数组,下面的generateGroup方法则是执行把两个数组合并的请求。

根据N种规格中的M种规格值生成的全部规格组合的一种算法的更多相关文章

  1. mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法

    [CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问 ...

  2. GOF提出的23种设计模式是哪些 设计模式有创建形、行为形、结构形三种类别 常用的Javascript中常用设计模式的其中17种 详解设计模式六大原则

    20151218mark 延伸扩展: -设计模式在很多语言PHP.JAVA.C#.C++.JS等都有各自的使用,但原理是相同的,比如JS常用的Javascript设计模式 -详解设计模式六大原则 设计 ...

  3. python:函数中五花八门的参数形式(茴香豆的『回』字有四种写法)

    毫不夸张的说,python语言中关于函数参数的使用,是我见过最为灵活的,随便怎么玩都可以,本文以数学乘法为例,演示几种不同的传参形式: 一.默认参数 def multiply1(x, y): retu ...

  4. VS编程,WPF中,获取鼠标相对于当前程序窗口的坐标的一种方法

    原文:VS编程,WPF中,获取鼠标相对于当前程序窗口的坐标的一种方法 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/ ...

  5. Windows Phone中解决多模块多程序集之间相互循环引用的问题一种思路

    Windows Phone中解决多模块多程序集之间相互循环引用的问题一种思路 那就是利用mvvmlight中的messager组件(可单独提取出),制作双向的一个消息发送.通过公共的类的定义,来传递数 ...

  6. 只显示前几条数据的sql语句写法 七种数据库中Select Top的使用方法

    七种数据库中Select Top的使用方法 1. Oracle数据库 SELECT * FROM TABLENAME WHERE ROWNUM <= N 2. Infomix数据库 SELECT ...

  7. JQuery中根据属性或属性值获得元素(6种情况获取方法)

    根据属性获得元素 1.比如要获取页面p标签中属性有id的元素 $("p[id]").css("color","red"); 根据属性值获得元 ...

  8. js中如何删除某个元素下面的所有子元素?(两种方法)

    js中如何删除某个元素下面的所有子元素?(两种方法) 一.总结 方法一:通过元素的innerHTML属性 元素element.innerHTML=""; 方法二:通过元素的remo ...

  9. html中如何实现表格移入移出时背景颜色改变?(两种方法)

    html中如何实现表格移入移出时背景颜色改变?(两种方法) 一.总结 1.通过css的table标签的hover属性: 10 #tab:hover{ 11 background: green 12 } ...

随机推荐

  1. Recaman's Sequence_递推

    Description The Recaman's sequence is defined by a0 = 0 ; for m > 0, am = am−1 − m if the rsultin ...

  2. .a包生成64位

    ./configure  CC="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain ...

  3. 15、C#基础整理(递归)

    带输出参数的函数 输入参数相当于函数而言,相当于已经赋值了的变量,直接可用输出参数相当于定义一个没有值的变量,在函数中进行赋值,然后调用函数的时候将赋值带出函数 例: public void shuc ...

  4. MINIX3 系统任务分析

    MINIX3 系统任务分析  7.1 MINIX3 系统任务概要  MINIX3 怎么来给用户提供丰富的服务呢?除了中断,异常处理,除了时钟服务. 程序员总是希望一个操作系统给他提供足够的服务,使得他 ...

  5. js实现元素添加样式

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. iPhone不为人知的功能常用技巧,看完后才发现很多用iPhone的人实在是愧对乔布斯! - imsoft.cnblogs

    很多人花了四五千买部苹果,结果只用到四五百块钱的普通手机功能. iPhone不为人知的功能,常用技巧: 网上搜集整理的iPhone快捷键操作,虽然表面上iPhone按键只有一个HOME键,大部分操作都 ...

  7. 解决MySQL中【Cannot load from mysql.proc. The table is probably corrupted

    [错误过程]:MySQL从5.1升级至5.5后在调用存储过程时报出“Cannot load from mysql.proc. The table is probably corrupted.” [造成 ...

  8. Java-->实现断点续传(下载)

    --> 断点续传: 就像迅雷下载文件一样,停止下载或关闭程序,下次下载时是从上次下载的地方开始继续进行,而不是重头开始... --> RandomAccessFile --> poi ...

  9. c#实现数据的左补右补功能

    /// <summary>        /// 左補右補功能        /// </summary>        /// <param name="st ...

  10. 修饰符(static、final、abstract)第一篇

    三个修饰符: 一.static: 作用域: 1. 属性 1.1 静态属性不必要创建新对象,可直接用类调用 1.2 其值发生改变,则类中的值也会随之而变并延伸到其他对象中 例子: class Anima ...