【问题标题】:All variations of matrix矩阵的所有变体
【发布时间】:2020-03-31 15:53:49
【问题描述】:

我正在尝试编写一个算法来获取 JavaScript 中矩阵的所有可能变体。 这是我想要实现的目标:

蓝红 男、女、其他 小号中号大号 ----------------- 蓝色,男,小 蓝色,男,中 蓝色,男,大 蓝色,女性,小, 蓝色,女性,中等, 蓝色,女,大 蓝色,其他,小, 蓝色,其他,中等, 蓝色,其他,大 红色,男,小 红色,男,中 红色,男,大 红色,女性,小, 红色,女性,中等, 红色,女,大 红色,其他,小, 红色,其他,中等, 红色,其他,大

知道如何做到这一点吗?

【问题讨论】:

    标签: javascript algorithm matrix


    【解决方案1】:

    你想要的被称为几个列表的笛卡尔积。如果您有一组固定的列表,嵌套循环是生成笛卡尔积的简单方法。

    您可以通过迭代里程表样式的列表来将其推广到任意列表。 (不过,里程表的每个数字可能有不同的范围。)

    方法如下:

    function cartesian(m) {
        const res = [];
        const index = [];    // current index
        const max = [];      // length of sublists
    
        for (let i = 0; i < m.length; i++) {
            index.push(0);
            max.push(m[i].length);
        }
    
        for (;;) {
            res.push(index.map((i, j) => m[j][i]));
    
            let i = 0;
            index[i]++;
    
            while (index[i] == max[i]) {
                index[i] = 0;
                i++;
    
                if (i == m.length) return res;
                index[i]++;
            }
        }
    }
    

    这样称呼它:

    const m = [
        ["blue", "red"],
        ["male", "female", "other"],
        ["small", "medium", "large"],
    ];
    
    const p = cartesian(m);
    

    这会创建一个包含所有可能性的巨大列表,这可能并不理想。您可以通过对上面的代码推送到当前列表到结果数组的每个可能性做任何您想做的事情来更改函数。上面的代码会更改每次迭代中的第一项,这与您在帖子中显示的相反。

    【讨论】:

      【解决方案2】:

      您可以使用 reduce 遍历数组:

      let data = ['blue','red']
      let data2 =['male','female','other']
      let data3 =['small','medium','large']
      
      let result = data.reduce((acc,rec) => {
       
        return acc.concat(data2.reduce((acc2, rec2) => {
          
          return acc2.concat(data3.reduce((acc3,rec3) =>{
            
            return acc3.concat([`${rec}, ${rec2}, ${rec3}`])
          },[]))
        },[]))
      },[])
      
      console.log(result)

      【讨论】:

        猜你喜欢
        • 2012-04-24
        • 1970-01-01
        • 2019-11-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-13
        • 1970-01-01
        相关资源
        最近更新 更多