Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.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_Sorting - Fatal编程技术网

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