在同一单击时,在上升和下降顺序上对对象排序



我有一系列对象:

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只是因为它支持的选项数量几乎总是派上用场的(例如,对book10book1进行排序(

您只需要在某个地方维护排序类型,以便可以切换它。

有很多变体,但是这样简单的东西应该起作用:

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

最新更新