在多维数组javascript或coffeescript中获取最大值
我有一个如下所示的数组:在多维数组javascript或coffeescript中获取最大值,javascript,jquery,arrays,coffeescript,Javascript,Jquery,Arrays,Coffeescript,我有一个如下所示的数组: 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) 最终解决方案: 这不是问题的一部分,
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
除非设备.IE
justTheDates=magnitudeArray.map(i)->i[0]
@最早=Math.min.apply Math,justTheDates
@最新=Math.max.apply Math,justTheDates
其他的
@最早=震级数组[0][0]
@最新=震级阵列[0][0]
用于震级数组中的震级项
@最早=震级项目[0],如果震级项目[0]<@最早
@最新=震级项目[0],如果震级项目[0]>@latest
因此,首先使用array.map()
将二维数组转换为平面数组,然后使用Math.max()
可以使用.reduce()
array.reduce(function(max, arr) {
return Math.max(max, arr[0]);
}, -Infinity)
array.reduce(function(max, arr) {
return max >= arr[0] ? max : arr[0];
}, -Infinity);
这是一个不使用
Math.max
的版本
array.reduce(function(max, arr) {
return Math.max(max, arr[0]);
}, -Infinity)
array.reduce(function(max, arr) {
return max >= arr[0] ? max : arr[0];
}, -Infinity);
…和a.使用咖啡脚本中的理解:
Math.max.apply Math, (x[0] for x in array)
另外,请看_underline.js
- 它的读、写和维护效率更高
var sortedObject = _.sortBy(object, function(val, key, object) {
return val;
});
他们很容易链,并解释!
(就像道格拉斯·克罗克福德可能建议的那样)
在中提供了一个非常好的解决方案
如果您始终使用原始JavaScript执行数组操作,请查看_underline.js,它可以大大简化代码
希望有帮助,
祝你一切顺利!
Nash使用下划线.js的简单解决方案,可避免生成中间数组:
max = _(array).max(_.first)[0]
()样本输入:
最大的四个([[4,5,1,3],[13,27,18,26],[32,35,37,39],[10001001857,1])
函数最大四(arr){
var最大值=0;
var largestArr=[];
对于(var i=0;i我知道这是一篇老文章,但如果您(或其他人)想要整个数组中的最大数字,请尝试:
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。我不熟悉。map您能解释一下那里发生了什么吗?@freshyeball:---因此它对每个元素应用回调。在您的例子中,每个I
都是一个由2个元素组成的[1,5]
-数组,您只需返回第一项。arr.map()之后
已应用。您有另一个数组,其中包含每个嵌套数组的第一个元素。我想我的问题是…是。映射比循环效率高还是低?@Freshyeball:我确信它非常接近,而且我也确信这不是您现在需要考虑的问题。选择您可以阅读/维护更好的解决方案OffeeScript通常建议node,但可能值得注意的是,Array#map
不受支持“它只是更高效”——库如何比底层语言更高效?好问题,编写(阅读和维护)更高效。感谢@zerkms.+1.编辑的说明。我不会包含一个完整的新库。请解决这个问题。正确。这是针对那些“使用原始JavaScript一致地执行数组操作”的人。有些环境就是这样。如果要维护高级算法,这可能对您来说是一个优化。它还附带了一个强大的高级数据绑定模板引擎。坦率地说,我对下划线印象不深。+1是一个经典的折叠示例:)。咖啡脚本:max=array.reduce((max,arr)->Math.max,arr[0]),-Infinity
我看到更多的人支持这个答案。有人愿意为我接受的答案辩护吗?@Freshyeball:我不想说一个比另一个好。a.reduce()
只是将数组计算为一个值。.map()
基本上是一个.reduce())
将其计算为一个新集合。因此可以使用.reduce()
实现.map()
行为,如下所示:array.reduce(函数(arr,curr){arr.push(curr[0]);return arr;},[])
。然后您仍然可以使用Math.max.apply…
。使用.map()的优势
使用.apply的风格是避免重复调用Math.max
。直接减少到一个数字的好处可能是有点清晰。有趣。是的,我发现了垫片的工作原理,并为ie8实现了一个循环-@tq:return Math.max.apply(Math,arr.concat(max))
Splats:Math.max(x[0]用于阵列中的x)…
:)我不打算包含一个完整的新库,只需解决这个问题。好的,那么其他解决方案会更好:)。下划线有许多有用的小函数,根据我的经验,这些函数经常使用;而且它只有4KB,因此,如果是因为库的大小,那么在包含它时不会有太多膨胀的危险。
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);