陣列的操作(2)

阿逗發表於2017-12-18

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  

     https://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA==&mid=2651553296&idx=1&sn=dcec2412f5b4bdeef4971fd0c96f3958&chksm=8025a9d1b75220c77a9784056bb69a54cfb4d41dcc9dae971e321ce0074747bc6dc054505ae3&mpshare=1&scene=23&srcid=1218kPR7PaP1ZqyIVoLHXfHH#rd


相關文章