我有一个对象数组
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 :(得分: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 / 0
为Infinity
而1 / -0
为-Infinity
。
例如:
第一种情况:x = 0
,y = 0
:
1 / x = Infinity
1 / y = Infinity
Infinity - Infinity = NaN
NaN || 0 = 0
因此,两个数字相互之间保持未分类。
第二种情况:x = -0
,y = -0
:
1 / x = -Infinity
1 / y = -Infinity
(-Infinity) - (-Infinity) = NaN
NaN || 0 = 0
因此,两个数字相互之间保持未分类。
第三种情况:x = 0
,y = -0
:
1 / x = Infinity
1 / y = -Infinity
Infinity - (-Infinity) = Infinity
Infinity || 0 = Infinity
因此x
将在y
之后。
第三种情况:x = -0
,y = 0
:
1 / x = -Infinity
1 / y = Infinity
(-Infinity) - Infinity = -Infinity
-Infinity || 0 = -Infinity
因此x
将出现在y
之前。
这就是真的。
修改:要按相反顺序对其进行排序,请按以下方式交换x
和y
:
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
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));