2017-06-01 101 views
1

我試圖映射具有n維子數組的數組。我看過深度地圖,但我沒有使用任何對象。什麼我想要做的一個例子是:在deepMap數組在javascript中嵌套數組中映射非對象值

deepMap([4,5,[3,4,[2]]], (x) => x+5) 
    returns [9,10,[8,9,[7]]] 

的功能後,可以是任何功能

 const deepMap=(arr, fn) =>{ 
      const stop = arr.length===0; 
      const tail = arr.slice(1); 
      const head = arr[0]; 
      const front = head instanceof Array ? [head[0]]: [] ; 
      const next = fn(front, head); 
      return stop ? [] : front.concat(deepMap(tail,fn)); 

     } 

如何申請一個函數嵌套數組值,同時保持整個數組是嵌套數組?

任何幫助,非常感謝!

回答

0

使用簡單的遞歸。對於嵌套數組,映射遍歷數組遞歸調用deepMap。當你到達葉子時,調用該函數。

function deepMap(arr, fn) { 
 
    return arr instanceof Array ? arr.map(el => deepMap(el, fn)) : fn(arr); 
 
} 
 
console.log(deepMap([4, 5, [3, 4, [2]]], (x) => x + 5));

+0

感謝Barmar!我試圖不使用if語句,但是非常棒,幫助我可視化過程。我結束了這個: 'const deepMap =(arr,fn)=> const head = arr instanceof Array? arr.map((el)=> deepMap(el,fn)):fn(arr); 回頭; (deepMap([4,5,[3,4,[2]]],(x)=> x + 5));'並且它正常工作 – Timmehlkk

+0

您可以使用三元組代替: '返回arr instanceof數組? ...:...' – Barmar

0

你可能會做如在Haskellesque方式如下:

function deepMap([x,...xs],f){ 
 
    return x ? [Array.isArray(x) ? deepMap(x,f) : f(x), ...deepMap(xs,f)] 
 
      : []; 
 
} 
 
    
 

 
var arr = [4,5,[3,4,[2]]], 
 
    res = deepMap(arr, x => x+5); 
 
console.log(res);