Вот предметы:
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 ответ
Я вижу, что к этому сообщению добавлен тег производительности. Вы намеревались получить ответы о производительности с точки зрения времени, пространства или других аспектов?
Если вы хотите оптимизировать производительность с точки зрения времени, я должен воздержаться от предложения изменить внешний for
петля к for of
петля. Однако я вижу, что есть forEach
цикл внутри вложенного for
петля. Если вы действительно хотите оптимизировать производительность, рассмотрите возможность использования for
петля вместо этого .forEach
метод. Также подумайте, можно ли добиться того же результата, повторяя циклы в обратном направлении — это позволит сократить количество операций.1.
Учитывая, что стрелочная функция используется в .forEach()
обратный вызов, могут использоваться другие функции ecmascript-6 — например, const
и let
вместо var
, синтаксис распространения вместо звонка .concat()
, так далее.