字符串

function all(str) {
            if (!str) return []
            let res = []

            if (str.length == 1) {
                res.push(str)
            } else if (str.length > 1) {
                //遍历每一项
                for (let i = 0; i < str.length; i++) {
                    //拿到当前的元素
                    var left = str[i]
                    //除当前元素的其他元素组合
                    var rest = str.slice(0, i) + str.slice(i + 1, str.length)
                    //上一次递归返回的全排列
                    var preResult = all(rest)
                    //组合在一起
                    for (var j = 0; j < preResult.length; j++) {
                        var tmp = left + preResult[j]
                        res.push(tmp)
                    }
                }

            }
            return res
        }

数组

function arrall(arr) {
            if (!arr) return []
            var res = []

            if (arr.length > 1) {
                for (var i = 0; i < arr.length; i++) {
                    var tem = []
                    var left = arr[i]
                    tem.push(left)
                    var rest = arr.slice(0, i).concat(arr.slice(i + 1, arr.length))

                    var preResult = arrall(rest)
                    // console.log(preResult);

                    for (var j = 0; j < preResult.length; j++) {
                        var tmp = tem.concat(preResult[j])
                        res.push(tmp)

                    }
                }

            } else {
                res.push([arr])
            }

            return res
        }