【问题标题】:How to sort mixed formatted numbers (89, 900, 1k, 1.5k, 15.2k)如何对混合格式的数字(89、900、1k、1.5k、15.2k)进行排序
【发布时间】:2016-05-08 05:01:02
【问题描述】:

我正在尝试从网站(具体来说是 Pinterest)中提取一些字符串,然后整理这些字符串。问题是字符串既包含数字又包含文本(k 代表千,m 代表百万)。

 list.sort(function(a, b) {
        var compA = Number( $(a).find('.repinCountSmall').text().trim().replace(/[^0-9]/g, '') );
        var compB = Number( $(b).find('.repinCountSmall').text().trim().replace(/[^0-9]/g, '') );
        return (compA == compB) ? 0 : (compA > compB) ? -1 : 1;
    });

使用上面的代码,如果我有提供以下内容的 .repinCountSmall 列表函数:

1

250

999

1k

1.7k

17.3k

1.2m

当前函数的问题是它把1.7k中的“k”去掉,到达17。同样17.3k,1.2m分别被当作173和12处理。我希望以 k 结尾的数字首先乘以 1000,以 m 结尾的字符串分别乘以 1000000。该列表应在此转换后排序。

有什么解决办法吗?谢谢。

【问题讨论】:

  • “k”、“m”和没有字母是唯一可能的单位吗?

标签: javascript string sorting numbers


【解决方案1】:

您可以使用类似这样的转换函数(如果您必须允许“k”和“m”以外的乘数,显然您可以添加一些额外的else if 语句):

function toNumber(s) {
  s = s.replace(/[^\dkm.]/g,"");
  var u = s.slice(-1);
  if (u === "k")
    return s.slice(0,-1) * 1000;
  else if (u === "m")
    return s.slice(0,-1) * 1000000;
  return +s;
}

然后在您的 .sort() 比较器函数中引用它:

list.sort(function(a,b) {
  var n1 = toNumber($(a).find('.repinCountSmall').text());
  var n2 = toNumber($(b).find('.repinCountSmall').text());
  return n1 - n2;
});

另请注意,您不需要嵌套三元运算符来比较生成的两个数字:因为它们数字,您可以只返回一个相减的结果。

【讨论】:

  • 谢谢!稍作调整即可使用。我用 $(b) 替换第二个 $(a)​​ 并用 return n2 - n1 返回 n1 - n2 从最大的数字开始排序。谢谢 !感谢 Annapoornima Koppad 的英文版编辑!
  • 不客气。很抱歉重复a - 我现在已经修复了一个复制/粘贴错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 2018-10-17
  • 2020-03-21
相关资源
最近更新 更多