2014-10-31 33 views
1

我有对象例如排序包含数组肯定和否定零

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(); 

还有什么人可以推荐吗?

非常感谢

内华达州

+0

您必须将其作为特殊情况添加到排序功能中。显示你现在拥有的和有人能够告诉如何改变它。 – JJJ 2014-10-31 12:44:07

+3

不要使用字符串作为值,而只是一个int。 Int可以是负数 – 2014-10-31 12:45:19

+0

@AndreasFurster,它仍然不会正确地对它们进行排序,因为它会将带符号的零转换为“正常”零,并且什么都不会发生。 – Andy 2014-10-31 12:47:49

回答

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 
    

    因此xy后。

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

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

    因此xy之前。

这就是它的全部。


编辑:要以相反的顺序排序,它只是换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));

希望有所帮助。

+0

非常感谢! – Nevnev 2014-10-31 13:01:53

+0

@Nevnev你应该接受你的问题的最佳答案。点击最佳答案旁边的勾号。 – 2014-10-31 13:10:17

+0

您可能想要编辑示例代码,按照问题要求的(颠倒)顺序进行排序。 – 2014-10-31 13:27:19

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

+0

谢谢@georg我会试试 – Nevnev 2014-10-31 12:53:18

+2

这不是一个安全的假设。只要你添加'{first_nom:'greg',值:'-0.000000009'},'你开始看到这个问题。 – DRobinson 2014-10-31 12:57:00

+0

@DRobinson:非常有见地。我无法想象我是如何错过的。 – georg 2014-10-31 13:17:13

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"} 
] 
+0

谢谢你的工作! – Nevnev 2014-10-31 13:01:27

+0

字符串比较可能不是比较数字的最佳方法。 – 2014-10-31 13:16:46

+1

@AaditMShah当然不是。但在这个疯狂的案例中,我们需要将'-0'和'+ 0'视为不同的实体,但它并不比依靠不同版本的零除。 – 2014-10-31 13:26:43