在多维数组javascript或coffeescript中获取最大值

Posted

技术标签:

【中文标题】在多维数组javascript或coffeescript中获取最大值【英文标题】:Get largest value in multi-dimensional array javascript or coffeescript 【发布时间】:2012-06-24 09:03:27 【问题描述】:

我有一个如下所示的数组:

array = [[1, 5], [4, 7], [3, 8], [2, 3],  
 [12, 4], [6, 6], [4, 1], [3, 2], 
 [8, 14]]

我需要的是集合的第一个值中的最大数字,所以在这种情况下12。 在网上看一些例子,我看到的最好的方法是:

Math.max.apply Math, array

问题是,这只适用于一维数组。我将如何为我的 senario 实现这一点? (允许使用 jquery)


最终解决方案:

这不是问题的一部分,但我需要数组中的最小值和最大值,这有点改变。

    unless device.IE
        justTheDates    = magnitudeArray.map (i) -> i[0]
        @earliest       = Math.min.apply Math, justTheDates
        @latest         = Math.max.apply Math, justTheDates                 
    else
        @earliest       = magnitudeArray[0][0]
        @latest         = magnitudeArray[0][0]
        for magnitudeItem in magnitudeArray
            @earliest   = magnitudeItem[0] if magnitudeItem[0] < @earliest
            @latest     = magnitudeItem[0] if magnitudeItem[0] > @latest

【问题讨论】:

【参考方案1】:

ES2019 Array.prototype.flat() 与解构。

const max = Math.max(...arr.flat());

https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Array/flat

【讨论】:

【参考方案2】:

我知道这是一篇旧帖子,但如果您(或其他人)想要整个数组中最大的数字,请尝试:

var array = [[1, 5], [4, 7], [3, 8], [2, 3],  
 [12, 4], [6, 6], [4, 1], [3, 2], 
 [8, 14]];

var max = array.reduce(function (max, arr) 
    return max >= Math.max.apply(max, arr) ? max : Math.max.apply(max, arr);
, -Infinity);
console.log(max);

在本例中,它将返回值 14。

【讨论】:

【参考方案3】:

示例输入: 最大的Four([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

function largestOfFour(arr) 

    var largest = 0;
    var largestArr = [];
    for(var i=0; i<arr.length; i++)
      for(var j=0; j<arr[i].length; j++)

        if(largest < arr[i][j])
          largest = arr[i][j];
        
        largestArr[i] = largest;
            
      largest = 0;
    

  return largestArr;

您可以从两个暗淡的数组中将最大的数字填充到新的数组中。

【讨论】:

【参考方案4】:
Array.prototype.maxX = function()
  return Math.max.apply(Math,this.map(function(o)return o[0];));
;

【讨论】:

【参考方案5】:

你可以使用.reduce()...

array.reduce(function(max, arr)  
    return Math.max(max, arr[0]); 
, -Infinity)

这是一个不使用Math.max的版本...

array.reduce(function(max, arr) 
    return max >= arr[0] ? max : arr[0];
, -Infinity);

...还有一个jsPerf test。

【讨论】:

+1 对于经典折叠示例:)。 CoffeeScript translation: max = array.reduce ((max, arr) -&gt; Math.max max, arr[0]), -Infinity 我看到更多投票支持这个答案。有人有兴趣在我接受的情况下为其辩护吗? @Fresheyeball:我不想说一个比另一个更好。 .reduce() 只是将 Array 评估为单个值。 .map() 基本上是 .reduce(),它会将其评估为新集合。因此可以使用.reduce() 来实现.map() 行为,如下所示:array.reduce(function(arr, curr) arr.push(curr[0]); return arr; , [])。然后你仍然会使用Math.max.apply...。将.map() 样式与.apply 一起使用的优点是可以避免重复的Math.max 调用。直接减少为数字的好处可能是有点清晰。 有趣。是的,我发现了 shim 的工作原理,并且刚刚为 ie8 实现了一个循环- @tq: return Math.max.apply(Math, arr.concat(max))【参考方案6】:

另外,请查看 _underscore.js。 Here is a link to the function _max().

读取、写入和维护效率更高。

关于 _underscore 最好的部分是还有大约 100 个类似于 _max 的辅助函数。喜欢排序。

比较下面的语法:

var sortedObject = _.sortBy(object, function(val, key, object) 
    return val;
);

它们很容易链接和解释! (就像 Douglas Crockford 可能建议的那样)

一个优秀的JSFIDDLE,提供在this post by @Raynos。

如果您一直使用原始 JavaScript 执行数组操作,请查看 _underscore.js,它可以大大简化您的代码。

希望对您有所帮助, 一切顺利! 纳什

【讨论】:

“简直是更高效”——库如何比底层语言更高效? 好问题,编写(阅读和维护)效率更高。感谢@zerkms 的澄清。 +1。已编辑。 我不会包含一个全新的库来解决这个问题。 正确。这适用于那些“始终使用原始 JavaScript 执行数组操作”的人。有些环境就是这样。如果维护高级算法,这可能是您的优化。它还带有用于高级数据绑定的强大模板引擎。 坦率地说,我对下划线印象不深。【参考方案7】:

使用 Underscore.js'max 的简单解决方案可避免生成中间数组:

max = _(array).max(_.first)[0]

(JSFiddle)

【讨论】:

我不会包含一个全新的库来解决这个问题。 好的,那么其他解决方案会更好:)。 Underscore 有许多有用的小功能,根据我的经验,这些功能经常使用;而且它只有4KB,所以,如果是因为库的大小,你在包含它的时候不会有膨胀太多的危险。【参考方案8】:

在 CoffeeScript 中使用推导式:

Math.max.apply Math, (x[0] for x in array)

Running example

【讨论】:

splats can do the job too: Math.max (x[0] for x in array) ... :)【参考方案9】:

http://jsfiddle.net/zerkms/HM7es/

var max = Math.max.apply(Math, arr.map(function(i) 
    return i[0];
));​

所以首先您使用array.map() 将二维数组转换为平面数组,然后使用Math.max()

【讨论】:

我不熟悉.map 你能解释一下那里发生了什么吗? @Fresheyeball: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/… --- 所以它对每个元素应用回调。在您的情况下,每个 i 是一个 [1, 5] - 2 个元素的数组,您只需返回第一项。应用arr.map() 后,您有另一个数组,其中包含每个嵌套数组的第一个元素 我想我的问题是...... .map 比循环效率更高还是更低? @Fresheyeball:我确信它非常接近它,我也确信这不是你现在需要考虑的事情。选择您可以更好地阅读/维护的解决方案 CoffeeScript 经常建议节点,但可能值得注意的是 Array#map 不支持

以上是关于在多维数组javascript或coffeescript中获取最大值的主要内容,如果未能解决你的问题,请参考以下文章

对于 JavaScript 多维数组的深层副本,深入一层似乎就足够了。这是真的吗?

如何在 Javascript 中创建多维数组? [复制]

在javascript中创建新的数组排序多维数组

数组多维javascript

JavaScript中的多维数组问题

如何在javascript中对多维数组进行排序