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

IT技术 javascript jquery arrays coffeescript
2021-03-09 04:42:06

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

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
6个回答

您可以使用.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 测试

@tq: return Math.max.apply(Math, arr.concat(max))
2021-04-22 04:42:06
+1 对于经典折叠示例:)。CoffeeScript翻译max = array.reduce ((max, arr) -> Math.max max, arr[0]), -Infinity
2021-05-10 04:42:06
@Fresheyeball:我不想说一个比另一个更好。A.reduce()只是将 Array 评估为单个值。A.map()基本上是将.reduce()其评估为新集合的 a 。因此,一个.map()行为可以实现.reduce()这样的:array.reduce(function(arr, curr) { arr.push(curr[0]); return arr; }, [])然后你仍然会使用Math.max.apply.... 使用.map()with 样式的好处.apply是可以避免重复Math.max调用。直接归约到一个数字的好处可能是有点清晰。
2021-05-15 04:42:06
有趣的。是的,我找到了 shim 的工作原理,并为 ie8 实现了一个循环-
2021-05-17 04:42:06
我看到更多投票支持这个答案。有人有兴趣为它做一个案例而不是我接受的案例吗?
2021-05-20 04:42:06

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

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

所以一开始你使用array.map()将二维数组转换为平面数组,然后使用Math.max()

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

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

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

( JSFiddle )

我不会包含一个全新的库,只是解决这个问题。
2021-04-26 04:42:06
好的,那么其他解决方案会更好:)。Underscore 有许多有用的小函数,根据我的经验,它们经常使用;而且它只有 4KB,所以,如果是因为库的大小,你在包含它时不会有太多膨胀的危险。
2021-04-28 04:42:06

在 CoffeeScript 中使用理解:

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

运行示例

Splats也可以完成这项工作: Math.max (x[0] for x in array) ...:)
2021-05-13 04:42:06

另外,看看_underscore.js。这是函数 _max() 的链接。

  • 它只是更有效地读取、写入和维护。

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

比较以下语法:

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

它们易于链接和解释!(就像道格拉斯·克罗克福德(Douglas Crockford)可能建议的那样)

@Raynos这篇文章中提供了一个优秀的 JSFIDDLE

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

希望能帮到你,祝一切顺利!纳什

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