此问题已经在这里有了答案:
我正在尝试返回已排序产品的列表:
return products.sort(getSortFunc(activeSortId))
每个activeSortId
对应于通过调用getSortFunc
检索的排序回调函数。我有三个排序功能:sortByPriceAsc,sortByPriceDesc,sortByDate。
问题:当用户sortByPriceDesc后跟sortByDate时,结果(逻辑上)仍按降价排序。但是,我希望按价格升序排序。我可以通过链接排序功能(return products.sort(a).sort(b).sort(c)
)解决此问题,但是如果我不知道顺序怎么办?:
我想知道是否可以通过致电函数[[sortByDate中的sortByPriceAsc,还是类似的东西?下面是一个简化的尝试,但显然不起作用,因为调用sortByPriceAsc不会进行任何修改:
sortByPriceAsc: (a, b) => a.price - b.price,
sortByDate: (a, b) => {
this.sortByPriceAsc()
return b.date - a.date
}
很高兴获得任何帮助或一般批评。
sortByDate
中,无论何时调用它,请检查该变量以找出在两个日期相同的情况下要返回的内容: const arr = [
{ date: 1, price: 5 },
{ date: 2, price: 10 },
{ date: 2, price: 20 },
{ date: 3, price: 30 },
{ date: 3, price: 40 },
{ date: 4, price: 50 },
];
let lastWasAsc = false;
const sorts = {
sortByPriceAsc: (a, b) => a.price - b.price,
sortByDate: (a, b) => {
return b.date - a.date || (
lastWasAsc
? a.price - b.price
: b.price - a.price
);
}
};
// When sorting by ascending order, set lastWasAsc to true:
lastWasAsc = true;
arr.sort(sorts.sortByPriceAsc);
// Then, later:
arr.sort(sorts.sortByDate);
console.log(arr);
与调用lastWasAsc
时false
为sortByDate
时的比较:const arr = [ { date: 1, price: 5 }, { date: 2, price: 10 }, { date: 2, price: 20 }, { date: 3, price: 30 }, { date: 3, price: 40 }, { date: 4, price: 50 }, ]; let lastWasAsc = false; const sorts = { sortByPriceAsc: (a, b) => a.price - b.price, sortByDate: (a, b) => { return b.date - a.date || ( lastWasAsc ? a.price - b.price : b.price - a.price ); } }; // Then, later: arr.sort(sorts.sortByDate); console.log(arr);
请记住,arr.sort(cb1).sort(cb2)
将不是必须考虑由
(一种稳定的排序算法is when,当确定两个元素由于具有相同的“权重”而在结果中彼此相邻时,它们在输出中的顺序与输入中的顺序相同。用Javascript不能保证。尽管ES2019要求cb1
排序的任何内容-排序算法不一定稳定,因此行为在实现上会有所不同(因此,不应使用.sort(..).sort(
)。Array#sort
稳定,但并非所有实现都符合该要求。]