使用递归调用的方式实现一维数组内所有元素的全排列 并去重

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