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