两个回调作为Array.sort()的参数,而不是Array.sort()。sort()[重复]

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

此问题已经在这里有了答案:

我正在尝试返回已排序产品的列表:

return products.sort(getSortFunc(activeSortId))

每个activeSortId对应于通过调用getSortFunc检索的排序回调函数。我有三个排序功能:sortByPriceAscsortByPriceDescsortByDate

问题:当用户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 }
很高兴获得任何帮助或一般批评。
javascript sorting callback
1个回答
0
投票
一个选项是具有一个持久变量,该变量指示最后的asc / dec排序顺序。然后,在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);
与调用lastWasAscfalsesortByDate时的比较:

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)

不是必须考虑由cb1排序的任何内容-排序算法不一定稳定,因此行为在实现上会有所不同(因此,不应使用.sort(..).sort( )。

(一种稳定的排序算法is when,当确定两个元素由于具有相同的“权重”而在结果中彼此相邻时,它们在输出中的顺序与输入中的顺序相同。用Javascript不能保证。尽管ES2019要求Array#sort稳定,但并非所有实现都符合该要求。]
© www.soinside.com 2019 - 2024. All rights reserved.