对文本和数字进行排序可以在Firefox和Chrome中使用,但不能在Safari中使用

Order/Sort text and numbers works in Firefox and Chrome, but not Safari

本文关键字:Chrome Safari 但不能 Firefox 数字 文本 排序      更新时间:2023-09-26

我编写了一个jQuery脚本,按年份对结果进行排序,这在大多数浏览器中都能正常工作。对于safari浏览器,结果如下所示:

2006所有200720082009等。

当然列表应该是这样的

所有2006200720082009等。

我不明白为什么结果各不相同。

var li = $('#filter .milo-filter');
li.sort(function(a, b) {
    if(parseInt($(a).text()) > parseInt($(b).text()))
        return 1;
    else return -1;
});
$('#filter').empty().html(li);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<div class="milo-portfolio-filters clearfix">
  <ul data-option-key="filter" id="filter"> 
    <li class="milo-filter">
      <a class="selected " title="All" data-option-value="*" href="#">All</a>
    </li>
    <li class="milo-filter">
      <a title="2015" data-option-value=".2015" href="#">2015</a>
    </li>
    <li class="milo-filter">
      <a title="2011" data-option-value=".2011" href="#">2011</a>
    </li>
    <li class="milo-filter">
      <a title="2006" data-option-value=".2006" href="#">2006</a>
    </li>
    <li class="milo-filter">
      <a title="2007" data-option-value=".2007" href="#">2007</a>
    </li>
    <li class="milo-filter">
      <a title="2008" data-option-value=".2008" href="#">2008</a>
    </li>
    <li class="milo-filter">
      <a title="2013" data-option-value=".2013" href="#">2013</a>
    </li>
    <li class="milo-filter">
      <a title="2010" data-option-value=".2010" href="#">2010</a>
    </li>
    <li class="milo-filter">
      <a title="2009" data-option-value=".2009" href="#">2009</a>
    </li>
    <li class="milo-filter">
      <a title="2014" data-option-value=".2014" href="#">2014</a>
    </li>
    <li class="milo-filter">
      <a title="2012" data-option-value=".2012" href="#">2012</a>
    </li>
  </ul>
</div>

这里是一个Codepen,以便更好地理解。http://codepen.io/scooma/pen/yJKxPJ

当两个成员之间没有绝对相等的状态时,浏览器不需要按照你认为应该的顺序给出它们(因为你并不真正知道浏览器将数组成员发送给排序函数的确切顺序)。

对于代码中的问题,如果您检查parseInt("All") < parseInt(2015)parseInt("All") > parseInt(2015),您将看到它们都返回false。

下面是一个示例,代码完全相同,但返回值在chrome和firefox中是不同的(由于确切的"问题"):

a = [1, 2, 3, 41, 42]
a.sort(function(a, b) {
  if (a == 41) {
    a = 4;
  }
  if (b == 41) {
    b = 4;
  }
  if (a == 42) {
    a = 4;
  }
  if (b == 42) {
    b = 4;
  }
  
  if (a > b) {
    return 1;
  }
  return -1;
})
console.log(a)

Chrome中的返回值:[1,2,3,41,42]
Safari中的返回值:[1,2,3,42,41]

的解决方案

解决方案是检查您的值是否为文本,并根据该值返回相关值(1/-1):

var li = $('#filter .milo-filter');
li.sort(function(a, b) {
    if(isNaN(parseInt($(a).text()))) {
      // If we can't parse the first element as a number, it is probably text, and it should appear first
       return -1;
    }
    if(isNaN(parseInt($(b).text()))) {
      // If we can't parse the second element as a number, it is probably text, and it should appear last
       return 1;
    }
    if (parseInt($(a).text()) > parseInt($(b).text())) {
        return 1;
    }
    return -1;
});
$('#filter').empty().html(li);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<div class="milo-portfolio-filters clearfix">
            <ul data-option-key="filter" id="filter"> 
                  <li class="milo-filter">
                    <a class="selected " title="All" data-option-value="*" href="#">All</a>
                </li>
             
                            <li class="milo-filter">
                    <a title="2015" data-option-value=".2015" href="#">2015</a>
                </li>
                            <li class="milo-filter">
                    <a title="2011" data-option-value=".2011" href="#">2011</a>
                </li>
                            <li class="milo-filter">
                    <a title="2006" data-option-value=".2006" href="#">2006</a>
                </li>
                            <li class="milo-filter">
                    <a title="2007" data-option-value=".2007" href="#">2007</a>
                </li>
                            <li class="milo-filter">
                    <a title="2008" data-option-value=".2008" href="#">2008</a>
                </li>
                            <li class="milo-filter">
                    <a title="2013" data-option-value=".2013" href="#">2013</a>
                </li>
                            <li class="milo-filter">
                    <a title="2010" data-option-value=".2010" href="#">2010</a>
                </li>
                            <li class="milo-filter">
                    <a title="2009" data-option-value=".2009" href="#">2009</a>
                </li>
                            <li class="milo-filter">
                    <a title="2014" data-option-value=".2014" href="#">2014</a>
                </li>
                            <li class="milo-filter">
                    <a title="2012" data-option-value=".2012" href="#">2012</a>
                </li>
                        </ul>
        </div>