在 Javascript 中一次迭代中进行映射和排序?

问题描述 投票:0回答:2

是否可以将一个数组映射到一个新数组并同时对其进行排序,而无需迭代两次(一次用于第一个数组上的映射,一次用于第二个数组上的排序)?当使用这样的映射方法时,我一直尝试使用匿名函数对其进行排序:

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);

但似乎不起作用。我的实现方式是否偏离了基础,或者只是我的代码有问题?

javascript dictionary sorting
2个回答
23
投票

排序本身通常需要多次迭代。对于一般情况,几乎可以肯定是 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
投票

从 ECMAScript 2023 开始,有一个本机方法:

toSorted
:

const arr = [4, 2, 20, 44, 6];
const arr2 = arr.toSorted((a, b) => a - b); // sort numerically
console.log("unsorted", ...arr);
console.log("  sorted", ...arr2);

© www.soinside.com 2019 - 2024. All rights reserved.