Javascript排序函数。先排序,然后再排序
我有一个要排序的对象数组。每个对象都有两个参数:强度和名称Javascript排序函数。先排序,然后再排序,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有一个要排序的对象数组。每个对象都有两个参数:强度和名称 objects = [] object[0] = {strength: 3, name: "Leo"} object[1] = {strength: 3, name: "Mike"} 我想先按强度排序,然后按名称的字母顺序排序。我使用以下代码按第一个参数进行排序。那我怎么按秒排序呢 function sortF(ob1,ob2) { if (ob1.strength > ob2.strength) {return 1}
objects = []
object[0] = {strength: 3, name: "Leo"}
object[1] = {strength: 3, name: "Mike"}
我想先按强度排序,然后按名称的字母顺序排序。我使用以下代码按第一个参数进行排序。那我怎么按秒排序呢
function sortF(ob1,ob2) {
if (ob1.strength > ob2.strength) {return 1}
else if (ob1.strength < ob2.strength){return -1}
return 0;
};
功能sortF(ob1、ob2){
如果(ob1.strength>ob2.strength){return 1}
else如果(ob1.strength
谢谢你的帮助
(我使用前面提到的sortF作为传递给它的排序比较函数。)将您的排序函数扩展为这样
function sortF(ob1,ob2) {
if (ob1.strength > ob2.strength) {
return 1;
} else if (ob1.strength < ob2.strength) {
return -1;
}
// Else go to the 2nd item
if (ob1.name < ob2.name) {
return -1;
} else if (ob1.name > ob2.name) {
return 1
} else { // nothing to split them
return 0;
}
}
功能sortF(ob1、ob2){
如果(ob1.强度>ob2.强度){
返回1;
}如果(ob1.strengthob2.name){
返回1
}否则{//没有什么可以分割它们
返回0;
}
}
字符串比较是一种字母比较
function sortF(ob1,ob2) {
if (ob1.strength > ob2.strength) {return 1}
else if (ob1.strength < ob2.strength) {return -1}
else if (ob1.name > ob2.name) {return 1}
return -1;
};
与
else if(ob1.name
按多个键排序时,此小功能通常很方便:
cmp = function(a, b) {
if (a > b) return +1;
if (a < b) return -1;
return 0;
}
像这样应用它:
array.sort(function(a, b) {
return cmp(a.strength,b.strength) || cmp(a.name,b.name)
})
Javascript确实缺少Ruby,这使得这种比较非常优雅 当我在寻找这个问题的答案时,我在StackOverflow上找到的答案并不是我所希望的。因此,我创建了一个简单的、可重用的函数来实现这一点。它允许您使用标准的Array.sort,但使用firstBy().thenBy().thenBy()样式。
这是我第二次发布这个。第一次被一位版主删除,他说“请不要为自己的作品做宣传”。我不确定这里的规则是什么,但我试图回答这个问题。很抱歉,这是我自己的工作。请随时再次删除,但请向我指出所涉及的规则。在下面查找'sortFn'函数。此函数按无限数量的参数进行排序(例如在c#:SortBy(…).ThenBy(…).ThenBy(…).ThenByDesc(…)
函数sortFn(){
var sortByProps=Array.prototype.slice.call(参数),
cmpFn=功能(左、右、排序器){
var sortMultiplier=sortOrder==“asc”?1:-1;
如果(左>右){
返回+1*排序乘子;
}
if(左<右){
返回-1*sortMultiplier;
}
返回0;
};
返回函数(sortLeft、sortRight){
//通过复合键从对象获取值
var getValueByStr=函数(对象,路径){
变量i,len;
//准备钥匙
path=path.replace(“[”,“.”);
path=path.replace(']','');
path=path.split('.');
len=路径长度;
对于(i=0;i
pre{
字体系列:“信使新”信使空间;
空白:预包装;
}
之前:
结果:
您可以使用逻辑OR链接排序顺序
objects.sort(function(a,b)
{
if(a.strength > b.strength) {return 1;}
if(a.strength < b.strength) {return -1;}
if(a.name > b.name ) {return 1;}
if(a.name < b.name ) {return -1;}
return 0;
}
使用ES6,您可以
array.sort(函数(a,b){
return SortFn(a.strength,b.strength)| | SortFn(a.name,b.name)
})
私人sortFn(a,b):编号{
返回a==b?0:a
史蒂夫的答案,但更漂亮
objects.sort(函数(a,b)
{
如果(a.strength>b.strength){返回1;}
如果(a.strengthb.name){return 1;}
如果(a.name
在2018年,您可以只使用sort()ES6函数,它可以精确地执行您想要的操作。
你漏掉了同样的例子。cough Perl的spaceship操作符。谢谢。我已经搜索这个知识内核有一段时间了……我只是不知道如何使用它。特别是spaceship操作符。喜欢这个,在应用程序中实现。这也能用3个键工作吗?我还没有,但可能需要第三次排序。@AndySmith:当然,
cmp(a,b)| | cmp(c,d)| | cmp(e,f)
等etc@AndyB:从那以后就修好了那太棒了!但是,如果强度可以是未定义的,那么我们希望所有具有已定义强度的对象都先走一步。有没有像这样优雅的解决方案?可能是这样的:return((a.strength | Number.MAX_VALUE)-(b.strength | Number.MAX_VALUE))| a.name.localeCompare(b.name);是的,您可以为不存在的部分添加默认值,例如return((a.strength | | |无穷)-(b.strength | | |无穷))| a.name.localeCompare(b.name)代码>。但这取决于强度的可能值
。其作用类似于一个咒语返回a.z-b.z | a.x-b.x | a.y-b.y
您应该输入firstname,lastname ex
cmp = (a, b) => (a > b) - (a < b)
true - true // gives 0
false - false // gives 0
true - false // gives 1
false - true // gives -1
array.sort(function(a, b) {
return cmp(a.strength,b.strength) || cmp(a.name,b.name)
})
objects.sort(function (a, b) {
return a.strength - b.strength || a.name.localeCompare(b.name);
});
array.sort(function(a, b) {
return SortFn(a.strength,b.strength) || SortFn(a.name,b.name)
})
private sortFn(a, b): number {
return a === b ? 0 : a < b ? -1 : 1;
}
objects.sort(function(a,b)
{
if(a.strength > b.strength) {return 1;}
if(a.strength < b.strength) {return -1;}
if(a.name > b.name ) {return 1;}
if(a.name < b.name ) {return -1;}
return 0;
}