【发布时间】:2017-03-14 07:54:27
【问题描述】:
想象一下有这个数组:
var fees = [
'$0.9 + $0.1',
'$20 + $2',
'$0.7 + $0.4',
'$5 + $0.5',
'$0 + $0.01',
'$100 + $9',
'$1 + $1',
'$2 + $0.5'
];
我将如何使用 vanilla JavaScript 按数字升序对这些字符串值进行排序?
排序后想要的输出:
['$0 + $0.01'、'$0.7 + $0.4'、'$0.9 + $0.1'、'$1 + $1'、'$2 + $0.5'、'$5 + $0.5'、'$20 + $2'、'$100 + $9']我尝试了以下方法:
function mySort(a, b) {
return ((a < b) ? -1 : ((a > b) ? 1 : 0));
}
但这只是输出:
["$0 + $0.01"、"$0.7 + $0.4"、"$0.9 + $.1"、"$1 + $1"、"$100 + $9"、"$2 + $0.5"、"$20 + $2"、"$5 + $0.5" ]`这是否可能以一种简洁且合乎逻辑的方式实现?
我不希望得到总和,因为它会产生不需要的结果。考虑"$0.9 + $0.1" 和"$0.7 + $0.4" 的示例。 "$0.9 + $0.1" 将是一个较低的值,因为总和是 1,但我想排序以便 "$0.7 + $0.4" 是一个较低的值。所以基本上希望是按第一个数字升序排序,如果第一个数字在两个值之间相同,则对第二个数字进行排序
【问题讨论】:
-
您是说要按每个总和的结果排序,还是按每个总和的第一个数字的值排序(对于显示的数据,这将给出相同的结果)?
-
@nnnnnn 该值应被视为字符串,因此根本没有数学运算。现在的问题是“$ 100 + $ 9”被视为低于“$ 2 + $ 0.5”的价值,这不是我想要实现的目标。
-
@nikkop:这没有回答 nnnnnn 的问题,也没有真正的意义。通过将它们视为字符串,您无法(合理地)获得所需的顺序。您要么 A)提取第一个操作数的数值并按其排序,要么 B)求和并按结果排序。你做什么取决于你想要什么最终结果。正如 nnnnnn 所说,两者都给出了上面的示例结果(但并非所有输入都会)。
-
如果你真的想把字符串当成字符串,隐式地按字符串中的第一个数字排序,你想使用自然排序。这会使这个问题可能与javascript natural sort 重复
-
@T.J.Crowder 对不起,如果我误解了这个问题。但是,求和然后排序会产生不需要的结果,请考虑
"$0.9 + $0.1"和"$0.7 + $0.4"的示例。"$0.9 + $0.1"将是一个较低的值,因为总和是1,但我想排序以便"$0.7 + $0.4"是一个较低的值。所以基本上希望是按第一个数字升序排序,如果第一个数字在两个值之间相同,则按第二个数字排序。
标签: javascript arrays sorting numeric