使用下划线(underscore)的sortBy方法对对象数组进行排序

10

我有一个对象数组,我想按“home”字段的值升序排序该数组。该字段始终为数字。所以我尝试了以下代码:

_.sortBy(data.home.en, function(obj){ return obj.home });

当'home'的值小于10时,这种方法效果很好,但由于某些原因,10紧跟在1后面,所以最终的顺序看起来像这样:1,10,11,2,3,4,5,6,7,8,9。为什么会出现这种情况?谢谢...

1个回答

27

您的obj.home值是字符串,因此它们被视为字符串进行比较,'1' < '10'是成立的。如果您希望像数字一样对它们进行排序,则需要将它们转换为数字:

_.sortBy(data.home.en, function(obj){ return +obj.home });
或:
_.sortBy(data.home.en, function(obj){ return parseInt(obj.home, 10) });

演示:http://jsfiddle.net/ambiguous/DpfgV/1/


返回parseInt(obj.home,10)== >您可以返回obj.home*1,而不使用parseInt就可以完成操作 - ncubica
1
@ncubica:我认为+obj.home是更常见的快捷方式。 - mu is too short
但是 +obj.home 会添加字符串而不是数字,所以例如如果你有 10 (int) + "00" (str) 的结果将会是 1000,但是如果你写成 10 + ("00"*1),结果将会是 10。这正是你期望的结果,对吧? - ncubica
3
这里不适用那些,我们只是做像 return +'10' 这样的事情。你也省略了一个 +,把 10 + '00'*1 的 "一元加号转换为数字" 版本改为 10 + +'00' (需要注意空格);在这种情况下,我会使用 parseInt 来使意图更加清晰。 - mu is too short
无法理解parseInt的问题所在:对于读者来说,使用快捷方式使代码更清晰,为什么要为了节省几个位而使代码变得复杂呢? - Tilt
@Tilt:我也不知道问题出在哪里。如果“parseInt”太难打了,那么他们可能选择了错误的职业。或者他们只是想显得聪明。我不知道,我已经太老了 :) - mu is too short

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接