Создать все разделы набора элементов

Вот предметы:


    var item = ['a', 'b', 'c', 'd'];

Желаемый результат:


    [
        [ ['a'],['b'],['c'],['d'] ],
        [ ['a'],['b','c'],['d'] ],
        [ ['a'],['b'],['c','d'] ],
        [ ['a'],['b','c','d'] ],
        [ ['a'],['c'],['b','d'] ],....
    ]

Код:

function getCombinations(items) {
   var res = [];
   for (var i = 0; i < items.length; i++) {
      for (var j = i + 1; j <= items.length; j++) {
         var temp = items.slice(i, j);
         var remained = items.slice(0, i).concat(items.slice(j, items.length));
         if (remained.length > 0) {
            var combinations = getCombinations(remained);
            combinations.forEach(combination => {
               res.push([temp].concat(combination));
            });
         } else {
            res.push([temp]);
         }
      }
    }
   return res;
}

var item = ['a', 'b', 'c', 'd'];

console.log(getCombinations(item));

1 ответ
1

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

Если вы хотите оптимизировать производительность с точки зрения времени, я должен воздержаться от предложения изменить внешний for петля к for of петля. Однако я вижу, что есть forEach цикл внутри вложенного for петля. Если вы действительно хотите оптимизировать производительность, рассмотрите возможность использования for петля вместо этого .forEach метод. Также подумайте, можно ли добиться того же результата, повторяя циклы в обратном направлении — это позволит сократить количество операций.1.

Учитывая, что стрелочная функция используется в .forEach() обратный вызов, могут использоваться другие функции ecmascript-6 — например, const и let вместо var, синтаксис распространения вместо звонка .concat(), так далее.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *