我正在尝试返回已排序产品的列表:
return products.sort(getSortFunc(activeSortId))
mỗiactiveSortId
对应一个排序回调函数,通过调用 getSortFunc
来检索。我有三个排序函数:sortByPriceAsc,sortByPriceDesc,sortByDate.
问题:当用户sortByPriceDesc后跟sortByDate时,结果仍然(逻辑上)按降序价格排序。不过,我希望按价格升序排序。我可以通过链接排序函数( return products.sort(a).sort(b).sort(c)
)来解决这个问题,但是如果我不知道顺序怎么办?:
我想知道是否可以通过调用例如函数 sortByDate TRONG 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);
与调用 sortByDate
时 lastWasAsc
vì SAI
相比:
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);
Xin hãy nhớ,arr.sort(cb1).sort(cb2)
不一定会考虑按cb1
排序的任何内容 -排序算法不一定稳定,因此不同实现的行为会有所不同(因此不应使用 .sort(..).sort(
).
(稳定的排序算法 is when ,当两个元素由于具有相同的“权重”而被确定在结果中彼此相邻时,它们在输出中的顺序与它们在输入中的顺序相同。这在 Javascript 中是无法保证的。虽然 ES2019 要求 Array#sort 保持稳定,但并非所有实现都符合这一要求。)
Tôi là một lập trình viên xuất sắc, rất giỏi!