Fish Wang says to YSITD
var val = [0, 1, 2, 3] var map = new Map(); map.set(val.join('|'), true) var gen = [val]; var nextGen = null; var iter = 0; while (gen.length) { nextGen = []; for (var i = 0; i < gen.length; i++) { var original = gen[i] for (var j = 0; j < original.length - 1; j++) { var newI = original.slice(0); [newI[j], newI[j+1]] = [newI[j+1], newI[j]]; if (map.has(newI.join('|'))) { continue; } map.set(newI.join('|'), true); nextGen.push(newI) } } console.log(nextGen); gen = nextGen; iter++; } console.log(iter - 1, Array.from(map))