JavaScript中的多重排序
我有这样一个对象数组:-JavaScript中的多重排序,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有这样一个对象数组:- var arr = [ {total : 20, name: David}, {total : 10, name: Joe}, {total : 15, name: Tracy}, {total : 20, name: Joel}, {total : 15, name: Michael}, {total : 10, name: Arnold}, {total : 15, name: Paul}, ] 我需要先按总数排序,然后如果两个总数相同,我需要按名称排序 排序后我
var arr = [ {total : 20, name: David},
{total : 10, name: Joe},
{total : 15, name: Tracy},
{total : 20, name: Joel},
{total : 15, name: Michael},
{total : 10, name: Arnold},
{total : 15, name: Paul},
]
我需要先按总数排序,然后如果两个总数相同,我需要按名称排序
排序后我的预期结果如下:
var arr = [ {total : 20, name: David},
{total : 20, name: Joel},
{total : 15, name: Michael},
{total : 15, name: Paul},
{total : 15, name: Tracy},
{total : 10, name: Arnold},
{total : 10, name: Joe},
]
有人能告诉我如何使用Array.sort()对其进行排序吗?使用Array.sort(回调),回调函数有两个参数a、b是Array中的项,如果0 a gt b,则返回一个int值
单击按钮对数组进行排序
试试看
var水果=[“香蕉”、“橙子”、“苹果”、“芒果”];
document.getElementById(“demo”).innerHTML=fruits;
函数myFunction(){
水果。分类();
document.getElementById(“demo”).innerHTML=fruits;
}
就像这样….使用sort()方法
var数据=[
{总计:'20',姓名:'David'},
{总计:'10',名称:'Joe'},
{总计:'15',名称:'Tracy'},
{总数:'20',姓名:'Joel'},
{总计:'15',姓名:'Michael'},
{总计:'10',名称:'Arnold'},
{总计:'15',名称:'Paul'},
]
数据排序(函数(x,y){
var n=x.总计-y.总计;
如果(n!=0){
返回n;
}
返回x.name-y.name;
});
var i;
对于(i=0;i”;
}
这里是运行代码
排序方法可以方便地与函数表达式(和闭包)一起使用:
本文讨论了使用Array.sort()的两种方法
其中之一就是您正在寻找的确切解释——将compareFunction
传递给sort()的方法参数
这将允许您指定想要(在合理范围内)定义排序顺序的任何函数
例:
将按降序返回已排序的数组您可以使用自定义排序函数对数组进行排序。请使用了解有关排序功能的更多信息
您可以使用下面的代码进行排序
arr.sort((a,b)=>(b.total==a.total?(a.name>b.name):b.total-a.total)代码>
这是你问题的解决办法
var arr=[{total:20,名字:'David'},
{总数:10,姓名:'乔'},
{总数:15,姓名:'Tracy'},
{总数:20,姓名:'Joel'},
{总数:15,姓名:'迈克尔'},
{总数:10,姓名:'阿诺德'},
{总数:15名,姓名:'保罗'};
arr.sort((a,b)=>(b.total==a.total?(a.name>b.name):b.total-a.total);
控制台日志(arr)代码>您可以将排序条件与逻辑OR链接起来,并对总计
和名称
使用增量
var数组=[{total:20,name:'David'},{total:10,name:'Joe'},{total:15,name:'Tracy'},{total:20,name:'Joel'},{total:15,name:'Michael'},{total:10,name:'Arnold'},{total:15,name:'Paul'};
array.sort(函数(a,b){
返回b.total-a.total | | a.name.localeCompare(b.name);
});
console.log(数组)代码>
。作为控制台包装{max height:100%!important;top:0;}
您可以提供一个sortObject
,其中包含键及其各自的方向(按排序顺序):
然后可以使用该对象在数组中循环进行排序:
const arr=[
{总数:20,姓名:'大卫'},
{总数:10,姓名:'乔'},
{总数:15,姓名:'Tracy'},
{总数:20,姓名:'Joel'},
{总数:15,姓名:'迈克尔'},
{总数:10,姓名:'阿诺德'},
{总数:15名,姓名:'保罗'},
];
//按排序顺序输入键。键值为-1表示降序,1表示升序。
常数sortObject={
总数:-1,
姓名:1,,
};
//拿到sortObject的钥匙。
const sortKeys=Object.keys(sortObject);
const sortedArray=arr.sort((a,b)=>{
设排序=0;
设指数=0;
//循环,直到排序或排序键已处理。
while(排序===0&&indexa[键],乘以-1可反转方向。
排序=a[键]>b[键]?排序方向:-1*排序方向;
}
索引++;
}
返回排序;
});
控制台日志(Darray)代码>
var数组=[{total:20,name:'David'},{total:10,name:'Joe'},{total:15,name:'Tracy'},{total:20,name:'Joel'},{total:15,name:'Michael'},{total:10,name:'Arnold'},{total:15,name:'Paul'};
array.sort(函数(a,b){
返回totalCompare(a,b)| a.name.localeCompare(b.name);
});
函数totalCompare(a,b){
如果(a.总计===b.总计){
返回0;
}
返回b.总计-a.总计;
}
console.log(数组)代码>你是先自己尝试的吗?Array.sort MDN条目几乎给出了一个答案:如果要比较的第二项是日期而不是名称,有人能推荐如何进行相同的操作吗?在我的场景中,我希望根据名称对数组进行排序,如果有重复的名称,我希望使用最新日期对名称进行排序。请帮我弄清楚。@jatingrover如果您只想对日期排序,请使用localeCompare
arr.sort(function(a,b){
return a.total == b.total ? (a.name > b.name ? 1: -1) : a.total-b.total;
});
<!DOCTYPE html>
<html>
<body>
<p>Click the button to sort the array.</p>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
<script>
var fruits = ["Banana", "Orange", "Apple", "Mango"];
document.getElementById("demo").innerHTML = fruits;
function myFunction() {
fruits.sort();
document.getElementById("demo").innerHTML = fruits;
}
</script>
</body>
</html>
var data = [
{total : '20', name: 'David'},
{total : '10', name: 'Joe'},
{total : '15', name: 'Tracy'},
{total : '20', name: 'Joel'},
{total : '15', name: 'Michael'},
{total : '10', name: 'Arnold'},
{total : '15', name: 'Paul'},
]
data.sort(function (x, y) {
var n = x.total - y.total;
if (n != 0) {
return n;
}
return x.name - y.name;
});
var i;
for (i = 0; i < data.length; i++) {
document.write("<p>total:" + data[i].total +" name:" + data[i].name + "</p>");
}
arrayname.sort(function(a, b){
return b-a;
});
const sortObject = {
total: -1, // Descending
name: 1, // Ascending
};