【问题标题】:Array map on a multidimensional array [closed]多维数组上的数组映射[关闭]
【发布时间】:2021-08-20 17:40:04
【问题描述】:

我在 JavaScript 中有一个 5 维多维数组。我需要将每个值乘以m,但将其上限为cap。目前它是一个 5 维数组,但如果我在后期改进程序的功能,我可能需要添加另一个维度。所以如果可能的话,我想在未来证明我的MultArrFunction

有没有更好的方法来做到这一点?这看起来很乱。

const MultArrFunction = (arr, m, cap) => {
    return arr.map(v => v.map(v2 => v2.map(v3 => v3.map(v4 => {
        let ret;
        if((ret = m * v4) > cap) ret = cap;
        return ret;
    }))));
};

【问题讨论】:

  • 请显示您的输入结构和预期输出。您可以使用递归来使用Array.isArray(arr) 向下钻取值——如果是,则递归其元素,如果不是,则对标量执行操作。 if((ret = m * v4) > cap) ret = cap; 应该写成return Math.min(cap, m * v4)
  • 客观地说,“更好”是什么意思?显然有人猜到了“更好”的含义并得到了复选标记,但对于未来的回答者和寻找其他东西而不是你对更好的看法的人,请解释一下。
  • 正如问题中所解释的,更好 = 不凌乱。正如问题中所解释的,更好 = 面向未来,独立于数组的维度。一般来说,更好的是编写更好的代码。我的代码很乱。 Nina 的答案是流畅、编写良好的代码,在函数式编程中使用了良好的基本思想。 Nina 的代码是我所向往的。
  • ...和@ggorlen 的评论说的答案完全相同。也感谢 ggorlen。

标签: javascript multidimensional-array array-map


【解决方案1】:

您可以通过传递因子和最大值的闭包来采用递归方法。

const
    map = (array, fn) => array.map(v => Array.isArray(v)
        ? map(v, fn)
        : fn(v)
    ),
    fn = (f, max) => v => Math.min(v * f, max);
    
// call
// newArray = map(array, fn(m, cap))

【讨论】:

    猜你喜欢
    • 2012-05-06
    • 1970-01-01
    • 2017-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多