JavaScript Сочетания произвольного числа массивов и их индексов

1

Я имею дело с немного странной проблемой перестановки через n число заданных массивов.

Скажем, у меня есть 3 массива (но может быть и больше):

  • Массив A с длиной 2: var A = новый массив (1);
  • Массив B с длиной 2: var B = новый массив (1);
  • Массив C с длиной 3: var C = новый массив (2);

Я хочу рассчитать все возможные перестановки длин этих трех массивов.

Результат должен выглядеть примерно так:

  • А [0], В [0], С [0]
  • А [0], В [0], С [1]
  • А [0], В [0], С [2]
  • А [0], В [1], С [0]
  • А [0], В [1], С [1]
  • А [0], В [1], С [2]
  • А [1], В [0], С [0]
  • А [1], В [0], С [1]
  • А [1], В [0], С [2]
  • А [1], В [1], С [0]
  • А [1], В [1], С [1]
  • A [1], B [1], C [2]...

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

К сожалению, у меня нет рабочего кода для обмена. Я обновлю это сообщение, как только придумаю что-то, что даже отдаленно работает.

  • 1
    так что вы больше ищете комбинации данных показателей. что ты пробовал?
  • 1
    «Массив A длиной 2: var A = new Array (1);» Этот массив имеет длину 1, а не 2. "Массив C с длиной 3: var C = new Array (2);" Аналогично, длина этого массива равна 2, а не 3. Если вы задаете число в качестве единственного аргумента для new Array , он указывает длину, которую нужно назначить.
Теги:
arrays
permutation

1 ответ

3
Лучший ответ

Вы можете использовать структуру вложенных сокращений для произвольной длины заданного массива со значениями.

var words = [['quick', 'lazy'], ['brown', 'black', 'grey'], ['fox', 'dog']],
    result = words.reduce((a, b) => a.reduce((r, v) => r.concat(b.map(w => [].concat(v, w))), []));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

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

function getCombinations(array) {
    function iter(i, p) {
        if (i === array.length) {
            result.push(p); // <==================== use the items
            return;
        }
        array[i].forEach(function (a) {
            iter(i + 1, p.concat(a));
        });
    }

    var result = [];

    iter(0, []);
    return result;
}

var words = [['quick', 'lazy'], ['brown', 'black', 'grey'], ['fox', 'dog']],
    result = getCombinations(words);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
  • 0
    Привет Нина, классная работа. Это действительно работает, я попробовал это здесь ( jsfiddle.net/jarosciak/x67dh5to/3 ), и это производит именно то, что я хочу. Тем не менее, я не понимаю этот код достаточно, чтобы попасть внутрь самого цикла. Я не хочу просто выводить комбинации в конце расчета. Мне нужно уметь ловить каждый результат и что-то с ним делать. Как мне это сделать?
  • 0
    Пожалуйста, дайте мне знать, если это можно переписать таким образом, чтобы я мог уловить каждую из комбинаций по мере их расчета. Это, по сути, дало бы полный ответ на мой вопрос. Благодарю.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню