Получить все уникальные комбинации вложенного объекта - PullRequest
0 голосов
/ 27 января 2020

Я хочу запустить несколько бэк-тестов на определенных биржевых данных. Я хочу сделать это, сгенерировав массив опций стратегии, которые я передам в функцию обратного тестирования.

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

Количество комбинаций [0,1] и [2,3] равно 4, поэтому мой выходной массив будет состоять из 4 объектов стратегии.

Для иллюстрации, это мой (упрощенный) ввод :

const backtestSettings = {
  stopLoss: [5],
  bands: [
    {
      timeframe: 1,
      openMinVolatility: [0,1],
    },
    {
      timeframe: 5,
      openMinVolatility: [2,3],
    },
    {
      timeframe: 15,
      openMinVolatility: [0],
    },
    {
      timeframe: 30,
      openMinVolatility: [0],
    }
  ]
};

И я пытаюсь получить это как мой вывод:

[
  {
    stopLoss: 5,
    bands: [
      {
        timeframe: 1,
        openMinVolatility: 0
      },
      {
        timeframe: 5,
        openMinVolatility: 2
      },
      {
        timeframe: 15,
        openMinVolatility: 0
      },
      {
        timeframe: 30,
        openMinVolatility: 0
      }
    ]
  },
  {
    stopLoss: 5,
    bands: [
      {
        timeframe: 1,
        openMinVolatility: 1
      },
      {
        timeframe: 5,
        openMinVolatility: 2
      },
      {
        timeframe: 15,
        openMinVolatility: 0
      },
      {
        timeframe: 30,
        openMinVolatility: 0
      }
    ]
  },
  {
    stopLoss: 5,
    bands: [
      {
        timeframe: 1,
        openMinVolatility: 0
      },
      {
        timeframe: 5,
        openMinVolatility: 3
      },
      {
        timeframe: 15,
        openMinVolatility: 0
      },
      {
        timeframe: 30,
        openMinVolatility: 0
      }
    ]
  },
  {
    stopLoss: 5,
    bands: [
      {
        timeframe: 1,
        openMinVolatility: 1
      },
      {
        timeframe: 5,
        openMinVolatility: 3
      },
      {
        timeframe: 15,
        openMinVolatility: 0
      },
      {
        timeframe: 30,
        openMinVolatility: 0
      }
    ]
  }
]

Вопрос: Как мне преобразовать мой ввод в желаемый вывод? (Я потратил несколько дней, пробуя много разных вещей)

Бонус: у меня есть кое-что, работающее без групп (тот факт, что он вложенный, усложняет мне задачу), объединяя некоторые функции forEach, но на самом деле количество опций существенно, что делает мой код действительно длинным и нечитаемым. Поэтому я надеюсь, что есть решение, которое также может принимать произвольное количество опций вместо цепочки функций forEach.

1 Ответ

0 голосов
/ 27 января 2020

Поскольку вы ищете подсказку, а не полное решение, одна (нерекурсивная) вспомогательная функция может дать вам старт:

const crossproduct = (xss) =>
  xss .reduce (
    (ps, xs) => ps .reduce ((r, p) => [... r, ... (xs .map ((x) => [... p, x]))], []), 
    [[]]
  )

const as = [1, 2], bs = ['a', 'b', 'c'], cs = ['x'], ds = ['y', 'z']

console .log (crossproduct ([as, bs, cs, ds]))

Это принимает обобщенное декартово произведение массива массивов. Это кажется важным шагом в вашем процессе.

...