2010-03-03 63 views
3

是否有可能将一个数组映射到一个新的数组并对其进行排序,而无需迭代两次(一次是第一个数组上的映射,一个是第二个数组上的排序)?我一直试图用匿名函数对它进行排序,如下所示:在JavaScript中映射和排序一次迭代?

var arr=[4,2,20,44,6]; 
var arr2=arr.map(function(item, index, array){ 
    if(index==array.length-1 || item==array[index+1]){ 
     return item; 
    } 
    else if((item-array[index+1])<0){ 
     return item; 
    } 
    else if((item-array[index+1])>0){ 
     return array[index+1]; 
    } 
}); 
console.log(arr2); 

但它似乎并不奏效。我的方式是基于如何实现这个目标,还是仅仅存在我的代码问题?

回答

2

排序通常需要一次以上的迭代。对于一般情况,几乎可以肯定是O(n log n)(该算法不是ECMAScript指定的,但这是用比较排序可以做的最好的),所以同时进行这两项操作并不重要。

你可以把它们连成一个表达虽然,因为数组本身sort回报:

function order(a, b) { 
    return a < b ? -1 : (a > b ? 1 : 0); 
} 
var arr2 = arr.map(function(item) { ... }).sort(order); 
0

我不认为这是可能的使用地图功能。为什么不直接排序?

+0

是的,我可以。我只是好奇它是否可以在一次迭代中完成。 – Yansky