2017-06-01 25 views
1

n次元のサブ配列を持つ配列をマップしようとしています。私はディープマップを見てきましたが、私はオブジェクトを使用していません。私がやろうとしているものの例は次のとおりです。javascript内のネストされた配列内の非オブジェクト値のマップ

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

機能deepMapの配列を維持しながら、あなたがネストされた配列内の値に関数を適用するにはどうすればよい

 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); リターンヘッド。あなたは3者を使用することができます: } console.log(deepMap([4,5、[3,4、[2]]、(x)=> x + 5));そしてそれは完全に働いた – Timmehlkk

+0

'return arr instanceof Array? ...:... ' – 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);

関連する問題