Javascript 什么';在二维数组中找到最短数组的最佳方法是什么?

Javascript 什么';在二维数组中找到最短数组的最佳方法是什么?,javascript,Javascript,例如,假设我有一个如下所示的数组: var myArray = [[1,2,3],[1,2,3,4],[1,2],[1,2]]; var shortest = myArray.reduce(function(p,c) {return p.length>c.length?c:p;},{length:Infinity}); 我试图在myArray中找到第一个最短的数组,在本例中,它将是myArray[2] 显然,我可以编写一个循环,检查每个数组的长度并返回最小的数组。我想知道的是,在jav

例如,假设我有一个如下所示的数组:

var myArray = [[1,2,3],[1,2,3,4],[1,2],[1,2]];
var shortest = myArray.reduce(function(p,c) {return p.length>c.length?c:p;},{length:Infinity});
我试图在
myArray
中找到第一个最短的数组,在本例中,它将是
myArray[2]

显然,我可以编写一个循环,检查每个数组的长度并返回最小的数组。我想知道的是,在javascript中是否有一种真正干净的方法来实现这一点。大致如下:


谢谢

你可以这样做:

var myArray = [[1,2,3],[1,2,3,4],[1,2],[1,2]];
var shortest = myArray.reduce(function(p,c) {return p.length>c.length?c:p;},{length:Infinity});

这使用了一个内部循环,因此比手动运行自己的循环要快,但需要一个垫片才能在较旧的浏览器中工作。

使用max或min的方式如下所示

Math.max.apply(Math, $.map(array, function (index) { return index.length }));

诀窍是映射到“内部数组长度”属性。

如果最好的说法是指最快的时间。。由于必须检查数组中的每个元素(假设未排序),因此无法获得比O(N)更好的解决方案


既然你不能取得比O(N)更好的成绩,我认为没有理由不做以下事情:

var myArray = [[1,2,3],[1,2,3,4],[1,2],[1,2]];

var shortestIndex = 0;

for( var i=1; i< myArray.length; i++){
    if(myArray[shortestIndex].length > myArray[i].length)
        shortestIndex = i;
}
var myArray=[[1,2,3]、[1,2,3,4]、[1,2]、[1,2];
var shortestIndex=0;
对于(var i=1;imyArray[i].length)
shortestIndex=i;
}

现在
myArray[shortestIndex]
是最短的数组。

除非外部数组被排序或其他什么,否则您必须始终循环。Resig的实现并不是真的更快(就复杂性而言),它只比显式循环的代码更短。但您可以使用附带的哈希表和数组来索引和记录更新时的大小和顺序。创建一个类,该类的行为类似于列表,但实现了一个返回最空容器的方法。你可以在把某个东西推到容器上或弹出某个东西时更新这个值。那么如何得到最短的值呢?@Vatev:
array.filter(函数(a){returna.length==maxlength;})
:-)是的,这就是我在尝试实现Resig的示例时得到的结果。
I==0
有什么好处?你没有通过初始化参数。需要垫片做什么?reduce函数?“旧浏览器”的确切含义是什么?我找到了我自己问题的答案:Array.reduce在任何早于9的IE、早于3的FireFox和早于4的Safari中都不起作用。@Bergi因为您要寻找最短的,init参数必须是这样的数组:
arr.length==Infinity
。显然,这是不可能的,所以需要一些技巧来模拟第一步。@Kolink:但是如果您明确地想跳过它,您仍然必须传入一些init参数。如果没有提供init参数,JavaScript的
fold
就像
fold1
一样工作,因此实际上跳过了
myArray[0]
。因此,删除
i==0 | |
,并有选择地传递
{length:-Infinity}
(如果
myArray
为空,则会产生不同)使用变量
shortestArray
将使我更易于阅读。“因为你无法实现比O(N)更好的东西。”当然,就复杂性而言,不会比O(N)更好可能仍然比另一个O(N)慢1000倍。我不确定这是否无关紧要。