【问题标题】:Passing 2 models versus one model to backbone comparator and doing alphanumeric sort将 2 个模型与一个模型传递给主干比较器并进行字母数字排序
【发布时间】:2015-11-26 07:16:22
【问题描述】:

新主干,我正在尝试按字母数字对集合进行排序,并且使用传入的一个模型进行排序,如下所示工作正常:

comparator: function(model) {
    return model.get('id').replace(/[^0-9^\.]/g,"")|0;
}

这是我之前的问题和解决方案: Sort a collection alphanumerically in backbone

现在,如果我做一些类似区域设置比较的事情:

comparator: function(model1, model2) {
    if ((model1.get('id').localeCompare(model2.get('id'))) < 0)
        return -1;
    }
    if ((model1.get('id').localeCompare(model2.get('id'))) >0) {
        return 1;
    }
    return 0;
}

这适用于输入:“id-1, id-0, id-2, id-199” 排序为“id-0, id-1, id-2, id-199”

但这里没有按数字排序:“id-1, id-0, id-2, id-199, id-99” 为“id-0, id-1, id-2, id-199, id -99" -- id-99 应该在 id-199 之前。显然是因为没有合并数值比较。我还没有成功地实现它,有什么想法吗?

【问题讨论】:

  • 这是无效的javascript代码。括号没有正确使用。如果句子也有同样的问题,应该是if (model1.get('id').localeCompare(model2.get('id')) &lt; 0)和后者。
  • @suish - 抱歉,我已经编写了代码并依靠我的能力在几乎午夜时匹配括号。我想我现在已经纠正了。

标签: javascript sorting backbone.js


【解决方案1】:

localeCompare 只需逐个比较每个字符。因此它不会将数字部分识别为数字,而是将单个数字(如 1、9、9)分开。 所以你需要为数字部分编写自己的比较器。

试试这段代码(我什至没有测试过代码,所以它可能有拼写错误或语法错误)

comparator: function(model1, model2) {
  var m1num = model1.get("id").replace(/[^0-9^\.]/g,"")|0 || 0
  var m1str = model1.get("id").replace(m1num,"")
  var m2num = model2.get("id").replace(/[^0-9^\.]/g,"")|0 || 0
  var m2str = model2.get("id").replace(m2num,"")
  switch(true){
    case m1str.localeCompare(m2str) < 0:
      return -1;
    case m1str.localeCompare(m2str) > 0:
      return 1;
    case m1str.localeCompare(m2str) == 0:
      if(m1num < m2num) return 1
      else if(m1num > m2num) return -1
      else return 0
  }
}

仅供参考,如果您的模型 ID 类似于“i8d-99”和“i7d-200”,则上述代码无法正常工作。因为该函数最终会比较 899 和 7200。但除此之外,它应该按照您的预期工作

【讨论】:

  • 谢谢,当我读到它时,这是有道理的。在阅读了一些帖子后,我也得出了类似的结论。在stackoverflow.com/questions/9431171/…查看上一篇文章的SortCustom功能我会试试这个。
【解决方案2】:

正如@suish 所指出的,这些行的解决方案(我必须做一些小修复):

comparator: function(model1, model2) {
  var m1num = model1.get("id").replace(/[^0-9^\.]/g,"")|0 || 0
  var m1str = model1.get("id").replace(/[0-9]/g,"")
  var m2num = model2.get("id").replace(/[^0-9^\.]/g,"")|0 || 0
  var m2str = model2.get("id").replace(/[0-9]/g,"")
  switch(true){
    case m1str.localeCompare(m2str) < 0:
      return -1;
    case m1str.localeCompare(m2str) > 0:
      return 1;
    case m1str.localeCompare(m2str) == 0:
      if(m1num < m2num) return -1
      else if(m1num > m2num) return 1
      else return 0
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 2016-04-26
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多