【问题标题】:combine object arrays recursively javascript/ typescript递归组合对象数组 javascript/ typescript
【发布时间】:2020-08-04 12:42:15
【问题描述】:

我有 n 个结构类似的数组

[{val_1: 2}, {val_1: 3}];
[{val_2: 2}];
[{val_3: 1}];

等等

我想创建一个结构类似于

的单个数组
[{val_1: 2, val_2: 2, val_3: 1}, {val_1: 3, val_2: 2, val_3: 1}]

在其中比较所有数组并产生每个可能的输出。在下面的代码中,我有 3 个数组。一个有 4 个值、2 个值和 3 个值。我希望它返回 24 个不同的数组,显示所有可能的组合。

      var val_1 = 3
  var val_2 = 2
  var val_3 = 1
  var total_val = 3;
  var useable = 50;

  var array_1 = new Array();
  var array_2 = new Array();
  var array_3 = new Array();
  var array_1_c = new Array();
  var array_2_c = new Array();
  var array_3_c = new Array();

  for(val_1; val_1 <= total_val && val_1 <= useable; val_1+=1){
    array_1 = [{val_1}];
    array_1.map(test =>{
      return{val_1}
    }).forEach(test => array_1_c.push(test));
  };
  var val_1 = 2
  for(val_1; val_1 >= 0; val_1-=1){
    array_1 = [{val_1}];
    array_1.map(test =>{
      return{val_1}
    }).forEach(test => array_1_c.push(test));
  };

  for(val_2; val_2 <= total_val && val_2 <= useable; val_2+=1){
    array_2 = [{val_2}];
    array_2.map(test =>{
      return{val_2}
    }).forEach(test => array_2_c.push(test));
  };
  for(val_3; val_3 <= total_val && val_3 <= useable; val_3+=1){
    array_3 = [{val_3}];
    array_3.map(test =>{
      return{val_3}
    }).forEach(test => array_3_c.push(test));
  }; console.log(array_1_c);console.log(array_2_c);console.log(array_3_c);

如何完成这样的事情? permute 函数似乎是要走的路,但我找不到输出每个组合的方法。如果创建数百万个组合,我应该走不同的路线而不是使用对象数组。

谢谢!

【问题讨论】:

  • 嗨,您能解释一下您是如何评估大小为 4、2 和 3 的数组的 12 种组合的吗?
  • 不知道为什么这被否决了。
  • 对不起,我的意思是 24 种组合*。 4 * 2 * 3 = 24。结果需要是每个值的顺序组合。
  • 我猜你需要Cartesian product 的解决方案,而不是排列。看看:stackoverflow.com/questions/56972012/…这个问题有你的问题的相关答案。

标签: javascript arrays typescript


【解决方案1】:

您可以通过使用对象数组来对笛卡尔积进行算法。

结果是一个包含给定数据所有属性的对象数组。

const
    getCartesian = array => array.reduce((a, b) => a.reduce((r, v) => r.concat(b.map(w => ({ ...v, ...w }))), [])),
    all = [[{ val_1: 2 }, { val_1: 3 }], [{ val_2: 2 }], [{ val_3: 1 }]],
    cartesian = getCartesian(all);
  
console.log(cartesian);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    猜你喜欢
    • 2019-12-31
    • 2020-04-24
    • 2016-07-26
    • 2019-09-27
    • 2019-05-08
    • 2017-12-14
    • 1970-01-01
    • 2016-11-03
    • 2011-06-14
    相关资源
    最近更新 更多