1、使用递归。对于给定字符串中的每个字母,为字母创建字谜。使用map()将字母与每部分字谜组合,然后使用reduce()将所有字谜组合到一个数组中,最基本情况是字符串长度等于2或1。
const anagrams = str => { if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str]; return str.split('').reduce((acc, letter, i) => acc.concat(anagrams(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)), []); }; // anagrams('abc') -> ['abc','acb','bac','bca','cab','cba'] // anagrams('读好书') -> ["读好书", "读书好", "好读书", "好书读", "书读好", "书好读"]
相当于数据里的排列组合里面的 全排列 个数就是 arr.length !
这里介绍一些 reduce 。
mdn说:
reduce()
方法对累加器和数组中的每个元素(从左到右)应用一个函数,将其减少为单个值。
var total = [0, 1, 2, 3].reduce(function(sum, value) { return sum + value; }, 0); // total is 6 var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) { return a.concat(b); }, []); // flattened is [0, 1, 2, 3, 4, 5]
可以简单理解对 数组的元素逐项做操作,下面是es6的写法
var flattened = [[0, 1], [2, 3], [4, 5]].reduce( ( acc, cur ) => acc.concat(cur), [] );
详细案例参考 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
更多有趣的数组操作: http://news.51cto.com/art/201712/561035.htm