var subsetsWithDup = function (nums) {
const result = [],
len = nums.length
nums = nums.sort((a, b) => a - b)
function subsetHelper(i, slate) {
if (len === i) {
result.push(slate.slice(0))
return
}
let count = 1,
j = i + 1
while (j < len && nums[j] === nums[i]) {
count++
j++
}
for (let copies = 0; copies < count + 1; copies++) {
for (let op = 0; op < copies; op++) {
slate.push(nums[i])
}
subsetHelper(count + i, slate)
for (let op = 0; op < copies; op++) {
slate.pop()
}
}
}
subsetHelper(0, [])
return result
}
// Tests
console.log(subsetsWithDup([1, 2, 3]))
console.log(subsetsWithDup([1, 2, 2, 2]))