Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在同一次单击中按升序和降序对对象数组进行排序_Javascript_Arrays_Node.js_Sorting_Javascript Objects - Fatal编程技术网

Javascript 在同一次单击中按升序和降序对对象数组进行排序

Javascript 在同一次单击中按升序和降序对对象数组进行排序,javascript,arrays,node.js,sorting,javascript-objects,Javascript,Arrays,Node.js,Sorting,Javascript Objects,我有一个对象数组: var arr = [{ title: "finance", book: "book1" }, { title: "nature", book: "book2" }, { title: "programming", book: "book3" }] HTML: 此JavaScript函数当前仅根据标题按升序对其进行排序。我如何编写一个按任意顺序排序的逻辑,即click1应按升序排序,click2应反转并按降序设置?基本上每次单击时都会反转排序。您只需

我有一个对象数组:

var arr = [{
  title: "finance",
  book: "book1"
},
{
  title: "nature",
  book: "book2"
},
{
  title: "programming",
  book: "book3"
}]
HTML:


此JavaScript函数当前仅根据标题按升序对其进行排序。我如何编写一个按任意顺序排序的逻辑,即click1应按升序排序,click2应反转并按降序设置?基本上每次单击时都会反转排序。

您只需要在某个位置维护排序类型,以便切换它

有很多变体,但像这样简单的东西应该可以:

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);
    }
}
self.sortTitle=函数(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
创建一个设置为false的布尔变量。在
sortTitle()
函数中,创建一个条件来检测它是真是假,然后在它为真时运行相反的操作。

您可以声明一个辅助变量来帮助您确定下一个需要对数组进行排序的方向。 像这样的事情:

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


您可以在
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;
}

如果有一个
可重用的
函数,您可以调用该函数为您进行排序,该函数还接受一个
方向参数

var arr=[{标题:“金融”,书籍:“book1”},{标题:“自然”,书籍:“book2”},{标题:“编程”,书籍:“book3”}]
设sortBy=(arr,p,o=1)=>[…arr].sort((a,b)=>a[p].localeCompare(b[p])*o)
console.log(排序为(arr,'title'))
console.log(排序(arr,'title',-1))
console.log(排序为(arr,'book'))

log(sortBy(arr,'book',-1))
反转为
使用闭包,并使用排序功能,这很好。谢谢。很高兴它帮助了@AshishVerma:)
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;
    }
}

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