【问题标题】:Is there a JS function for generating a dataset based on combinations of multiple sets有没有基于多组组合生成数据集的JS函数
【发布时间】:2020-06-20 22:31:13
【问题描述】:

我正在为下面的函数编写单元测试

const f1 = (a:boolean, b:1|2|3, c:'apple'|'banana') => {...}

是否有一个函数,给定函数 f1() 的每个参数的可能值,返回所有组合的数组:

[
  [true, 1, 'apple'],
  [true, 1, 'banana'],
  [true, 2, 'apple'],
  ...,
  [false, 3, 'banana']
]

【问题讨论】:

    标签: javascript typescript


    【解决方案1】:

    为此,我将以下网格搜索功能组合在一起。文末有用法示例。

    function gridSearch(vars) {
      let all = [];
      for (let prop in vars) {
        if (!vars.hasOwnProperty(prop)) continue;
        if (!Array.isArray(vars[prop])) vars[prop] = [vars[prop]];
        all.push(vars[prop].map(val => ({ [prop]: val })));
      }
    
      function cartesian() {
        var r = [],
          arg = arguments,
          max = arg.length - 1;
        function helper(arr, i) {
          for (var j = 0, l = arg[i].length; j < l; j++) {
            var a = arr.slice(0);
            a.push(arg[i][j]);
            if (i == max) r.push(a);
            else helper(a, i + 1);
          }
        }
        helper([], 0);
        return r;
      }
    
      let permutations = cartesian(...all);
      let final = [];
      permutations.forEach(permutation => {
        final.push(permutation.reduce((r, c) => ({ ...r, ...c }), {}));
      });
    
      return final;
    }
    
    const obj = {
      a: [1, 2, 3],
      b: [true, false],
      c: "foo"
    }
    
    const permutations = gridSearch(obj);
    
    console.log(permutations);

    【讨论】:

      【解决方案2】:

      没有内置函数可以做到这一点。这种类型的活动通常属于“组合学”的范畴。如果您有兴趣使用 NPM 包,请查看 js-combinatorics

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-08
        • 1970-01-01
        • 2010-11-17
        • 2018-01-13
        • 2017-11-10
        • 1970-01-01
        • 2018-10-20
        相关资源
        最近更新 更多