我有一系列对象:
var arr = [{
title: "finance",
book: "book1"
},
{
title: "nature",
book: "book2"
},
{
title: "programming",
book: "book3"
}]
html:
<th><a href="#" ng-click="controller.sortTitle()">TITLE</a></th>
现在,我已经在下面实现了基本的排序逻辑
JavaScript(AngularJS控制器(:
self.sortTitle = function () {
self.arr= self.arr.sort((a, b) => (a.title > b.title) ? 1 : -1);
}
此JavaScript功能当前仅根据标题以升序顺序排序。如何编写按任一顺序对其进行分类的逻辑,即单击1应该在上升中对其进行排序,而Click2应该反向并将其设置为下降?基本上每次单击的排序都会反转。
您可以在 self
上创建一个属性,例如 isAscending
,默认为true或false(最初您想要的任何东西(,基于哪个排序顺序将执行并每次运行fn运行时翻转 isAscending
。
self.isAscending = true;
self.sortTitle = function () {
if(self.isAscending){
self.arr= self.arr.sort((a, b) => (a.title > b.title) ? 1 : -1);
}else{
self.arr= self.arr.sort((a, b) => (a.title > b.title) ? -1 : 1);
}
self.isAscending = !self.isAscending;
}
拥有一个reusable
函数您可以致电为您进行分类可能会很有意义,该函数也接受direction parameter
:
var arr = [{ title: "finance", book: "book1" }, { title: "nature", book: "book2" }, { title: "programming", book: "book3" }]
let sortBy = (arr, p, o=1) => [...arr].sort((a,b) => a[p].localeCompare(b[p]) * o)
console.log(sortBy(arr, 'title'))
console.log(sortBy(arr, 'title', -1))
console.log(sortBy(arr, 'book'))
console.log(sortBy(arr, 'book', -1))
如果需要,可以替换最后一个参数以处理asc/desc
。
也要比较字符串,推荐的方法是使用字符串。Localecompare只是因为它支持的选项数量几乎总是派上用场的(例如,对book10
与book1
进行排序(
您只需要在某个地方维护排序类型,以便可以切换它。
有很多变体,但是这样简单的东西应该起作用:
const ascendingComparator = (a, b) => (a.title > b.title) ? 1 : -1;
const descendingComparator = (a, b) => (a.title > b.title) ? -1 : 1;
self.sortTitle = function (type) {
if (type === "ascending") {
self.arr = self.arr.sort(ascendingComparator);
type = "descending";
} else {
self.arr = self.arr.sort(descendingComparator);
type = "ascending";
}
}
向您的功能添加变量并更改条件
self.sortTitle = function (sortOrder) {
if (sortOrder === 'asc') {
self.arr= self.arr.sort((a, b) => (a.title > b.title) ? 1 : -1);
} else { //desc
self.arr= self.arr.sort((a, b) => (a.title < b.title) ? 1 : -1);
}
}
创建设置为false的布尔变量。在您的sortTitle()
函数中,创建一个条件,该条件将检测到它是对还是错误,然后在TRUE时相反。
您可以声明一个辅助变量,以帮助您确定需要对数组进行排序的下一个方向。这样的人:
self.sortTitle = function () {
sortArrayAsc = !sortArrayAsc;
self.arr= self.arr.sort((a, b) => sort(a,b, sortArrayAsc));
}
// ToDo: You can writte this nicer
self.sort = function (a, b, ascending) {
if(ascending) {
return a.title > b.title ? 1 : -1;
} else {
return a.title > b.title ? -1 : 1;
}
}