【问题标题】:map non-object values in nested arrays in javascript在javascript中的嵌套数组中映射非对象值
【发布时间】:2017-06-01 15:58:31
【问题描述】:

我正在尝试映射具有 n 维子数组的数组。我看过 deep-map 但我没有使用任何对象。我正在尝试做的一个例子是:

    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));

        }

如何将函数应用于嵌套数组中的值,同时保持整个数组为嵌套数组?

非常感谢任何帮助!

【问题讨论】:

    标签: javascript arrays multidimensional-array


    【解决方案1】:

    您可以按照 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);

    【讨论】:

      【解决方案2】:

      使用简单的递归。对于嵌套数组,以递归方式映射调用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));

      【讨论】:

      • 感谢巴尔玛!我试图不使用 if 语句,但这极大地帮助我想象了这个过程。我最终得到了这个:const deepMap = (arr,fn) =>{ const head = arr instanceof Array ? arr.map((el) => deepMap(el,fn)) : fn(arr); return head; } console.log(deepMap([4,5,[3,4,[2]]], (x) => x+5)); 它工作得很好
      • 你可以使用三元来代替:return arr instanceof Array ? ... : ...
      猜你喜欢
      • 2021-10-20
      • 2017-05-14
      • 2022-08-10
      • 2019-11-25
      • 2019-06-20
      • 2021-12-11
      • 2021-02-08
      • 2023-01-23
      • 1970-01-01
      相关资源
      最近更新 更多