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