使用递归调用的方式实现一维数组内所有元素的全排列 并去重
// 循环遍历数组中的每一项,将每一项都追加到数组中的第一项中,后面的每项再递归调用继续将所有的元素追加到数组中
// 递归结束后将返回结果拼接,拼接后的数组即为全排列的数组
function permutation (per) {
if (per.length === 1) { return [per] }
let res = []
per.forEach((v, i, arr) => {
let temp = [...arr]
let header = temp.splice(i, 1)
permutation(temp).forEach(val => res.push([...header, ...val]))
})
// 判断相同数组并去重,将数组转为JSON字符串,然后进行字符串去重
// 该方法无法进行数据类型判断,会将 1和'1'判断为相等,所以有相关需求的话不可以使用
return [...new Set(res.map(value => JSON.stringify(value)))].map(val => JSON.parse(val))
}
permutation([1,2,3,2])
// [[ 1, 2, 3, 2 ], [ 1, 2, 2, 3 ], [ 1, 3, 2, 2 ], [ 2, 1, 3, 2 ], [ 2, 1, 2, 3 ], [ 2, 3, 1, 2 ], [ 2, 3, 2, 1 ], [ 2, 2, 1, 3 ], [ 2, 2, 3, 1 ], [ 3, 1, 2, 2 ], [ 3, 2, 1, 2 ], [ 3, 2, 2, 1 ]]