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

Javascript 按属性值对对象进行排序

Javascript 按属性值对对象进行排序,javascript,jquery,sorting,Javascript,Jquery,Sorting,我在数组中有一些对象,希望对它们进行排序。对象应按度量值排序。所以我有以下功能: objectz.sort(function(a,b){ return b.metric - a.metric; } 问题是有些对象具有相同的属性值,排序的结果总是不同的。我想通过名称属性对具有相同度量值的对象进行额外排序,以便每次排序时都得到相同的对象顺序 提前谢谢 类似于虫族: objectz.sort(function(a,b){ var result = b.metr

我在数组中有一些对象,希望对它们进行排序。对象应按度量值排序。所以我有以下功能:

    objectz.sort(function(a,b){
        return b.metric - a.metric;
    }
问题是有些对象具有相同的属性值,排序的结果总是不同的。我想通过名称属性对具有相同度量值的对象进行额外排序,以便每次排序时都得到相同的对象顺序

提前谢谢

类似于虫族:

objectz.sort(function(a,b){
    var result = b.metric - a.metric;
    if (!result) return a.name > b.name ? 1 : -1;
    return result;
});
objectz.sort(function(a,b) {
    var x = b.metric - a.metric; 
    return x || b.name - a.name;
});
似乎是一种反向排序(先出现较高的值),这是您想要的吗

编辑 请注意,
-
运算符仅适用于“name”的值可以转换为数字的情况。否则,请使用
。sort函数应该处理a.name==b.name,这是
操作符本身无法处理的,因此您需要类似以下内容:

objectz.sort(function(a,b) {
    var x = b.metric - a.metric; 

    // If b.metric == a.metric
    if (!x) {

      if (b.name == a.name) {
        x = 0;

      else if (b.name < a.name) {
        x = 1;

      else {
        x = -1;
      }
    }
    return x;
});

如果有必要说塞尔达比安先来。此外,
name
的值应减少为所有小写(或所有大写),否则“zelda”和“Ann”将按与“zelda”和“Ann”相反的顺序排序

b.metric-a.metric
完全相同。当'
'a'-'b'
为我返回
NaN
时,
-
操作符将首先将两侧转换为数字。我假设
name
属性存储字符串,如果
name
无法转换为数字,它将返回NaN。将添加注释。
(b.name==a.name)?0
是没有意义的,只要你没有其他标准-你可以返回
1
-1
,这不会改变任何东西根据比较函数“应该是一个接受两个参数x和y的函数,如果xy,返回正值”。在这种情况下,对于x=y返回零是否重要,我不知道。对我来说,它应该包括在内,除非有一个很好的理由不包括在内,并且与返回x-y的数字一致。
objectz.sort(function(a,b) {
    var x = b.metric - a.metric; 

    if (!x) {
      x = (b.name == a.name)? 0 : (b.name < a.name)? 1 : -1;
    }
    return x;
});
      x = (b.name == a.name)? 0 : (b.name < a.name)? -1 : 1;