对包含正零和负零的数组进行排序

时间:2014-10-31 12:41:25

标签: javascript arrays sorting

我有一个对象数组

var objects = [ 
    { first_nom: 'dave', value: '5'},
    { first_nom: 'roger', value: '-0'},
    { first_nom: 'pete', value: '+0' },
    { first_nom: 'pete', value: '-5' },
];

按值对其进行排序最好将两个零反转。

我尝试了正常的javascript / jquery和下划线排序,但是他们忽略了领先的-+,可能也是如此。

这就是我现在所拥有的(这很好但忽略了+和 - ):

var chartData = _.sortBy(objects, 'value').reverse();

还有别人可以推荐的吗?

非常感谢

内华达州

3 个答案:

答案 0 :(得分:2)

您可以对它们进行特殊处理,当两个值均为0时将其排序为字符串:



var objects = [ 
    { first_nom: 'dave', value: '5'},
    { first_nom: 'roger', value: '-0'},
    { first_nom: 'pete', value: '+0' },
    { first_nom: 'pete', value: '-5' },
];

var sorted = objects.sort(
  function(a,b) {
    if ((a.value == 0) && (b.value == 0))
      {
        return b.value.localeCompare(a.value);
      }
    else
      return b.value - a.value;
  }
);

console.log(JSON.stringify(sorted));




结果:

[
  {"first_nom":"dave","value":"5"},
  {"first_nom":"pete","value":"+0"},
  {"first_nom":"roger","value":"-0"},
  {"first_nom":"pete","value":"-5"}
] 

答案 1 :(得分:1)

尝试以下方法:

var objects = [ 
    { first_nom: "dave",  value: "5"  },
    { first_nom: "roger", value: "-0" },
    { first_nom: "pete",  value: "+0" },
    { first_nom: "pete",  value: "-5" },
];

objects.sort(function (a, b) {
    var x = parseInt(a.value, 10);
    var y = parseInt(b.value, 10);

    if (x === 0 && y === 0)
        return 1 / x - 1 / y || 0;
    else return x - y;
});

alert(JSON.stringify(objects, null, 4));

这可行的原因是1 / 0Infinity1 / -0-Infinity

例如:

  1. 第一种情况:x = 0y = 0

    1 / x = Infinity
    1 / y = Infinity
    
    Infinity - Infinity = NaN
    
    NaN || 0 = 0
    

    因此,两个数字相互之间保持未分类。

  2. 第二种情况:x = -0y = -0

    1 / x = -Infinity
    1 / y = -Infinity
    
    (-Infinity) - (-Infinity) = NaN
    
    NaN || 0 = 0
    

    因此,两个数字相互之间保持未分类。

  3. 第三种情况:x = 0y = -0

    1 / x = Infinity
    1 / y = -Infinity
    
    Infinity - (-Infinity) = Infinity
    
    Infinity || 0 = Infinity
    

    因此x将在y之后。

  4. 第三种情况:x = -0y = 0

    1 / x = -Infinity
    1 / y = Infinity
    
    (-Infinity) - Infinity = -Infinity
    
    -Infinity || 0 = -Infinity
    

    因此x将出现在y之前。

  5. 这就是真的。


    修改:要按相反顺序对其进行排序,请按以下方式交换xy

    var objects = [ 
        { first_nom: "dave",  value: "5"  },
        { first_nom: "roger", value: "-0" },
        { first_nom: "pete",  value: "+0" },
        { first_nom: "pete",  value: "-5" },
    ];
    
    objects.sort(function (a, b) {
        var x = parseInt(a.value, 10);
        var y = parseInt(b.value, 10);
    
        if (x === 0 && y === 0)
            return 1 / y - 1 / x || 0;
        else return y - x;
    });
    
    alert(JSON.stringify(objects, null, 4));

    希望有所帮助。

答案 2 :(得分:0)

一个简单的解决方案是将带符号的零转换为某个有符号的小值,例如:

var objects = [ 
    { first_nom: 'dave', value: '5'},
    { first_nom: 'pete', value: '+0' },
    { first_nom: 'pete', value: '-5' },
    { first_nom: 'roger', value: '-0'},
];

  
convert = function(n) {
  if(n == '-0') return -Number.EPSILON;
  if(n == '+0') return +Number.EPSILON;  
  return parseInt(n);
}
  
objects.sort(function(a, b) {
  return convert(a.value) - convert(b.value);
});
  

document.write(JSON.stringify(objects));

要以纯数字方式执行此操作,请使用

这一事实
Math.atan2(0, -0) === Math.PI 
Math.atan2(0,  0) === 0       

(见Differentiating +0 and -0

var objects = [ 
    { first_nom: 'dave', value: '5'},
    { first_nom: 'roger', value: '-0'},
    { first_nom: 'pete', value: '+0' },
    { first_nom: 'pete', value: '-5' },
];

objects.sort(function(a, b) {
  a = parseInt(a.value);
  b = parseInt(b.value);
  return (a || b) ? (b - a) : (Math.atan2(0, a) - Math.atan2(0, b));
});
  
document.write(JSON.stringify(objects));