рекурсивно объединять массивы объектов javascript / typcript - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть n массивов, структурированных как

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

et c.

Я хочу создать один массив, структурированный как

[{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);

как бы что-то подобное было достигнуто? Кажется, что перестановочная функция - путь к go, но я не могу найти способ вывести каждую комбинацию. Если создается несколько миллионов комбинаций, я должен go другой маршрут, чем при использовании массива объектов.

Спасибо!

1 Ответ

2 голосов
/ 21 апреля 2020

Вы можете взять алгоритм для декартового произведения, используя массивы объектов.

Результатом является массив объектов со всеми свойствами заданных данных.

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; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...