【问题标题】:Javascript - Issue with sort function on Opera 11.60 and IE 8Javascript - Opera 11.60 和 IE 8 上的排序功能问题
【发布时间】:2012-01-07 21:46:12
【问题描述】:

我正在尝试按那里的属性对对象进行排序。我的功能在 Opera 和 IE 上有问题。到目前为止,我已经在这个阶段调试了Opera上的问题:

  1. 打开“Opera 浏览器”并按 cntr+shift+i。选择控制台。
  2. 在控制台中传递此代码,然后按 shift+enter。

    var DataArray=["Other","Attitude","Attitude","Delivery/timings","General   Performance","Personal Planning","Other"]
    DataArray=DataArray.sort(function(a,b)
    {
        return a<b;
     });
    
    JSON.stringify(DataArray);
    

你应该得到这样的正确结果:

["个人计划","其他","其他","一般表现","交付/时间","态度","态度"]

  1. 现在把排序功能改成a>b这样,按enter+shift键执行。

    var DataArray=["Other","Attitude","Attitude","Delivery/timings","General   Performance","Personal Planning","Other"]
    DataArray=DataArray.sort(function(a,b)
    {
        return a>b;
    });
    JSON.stringify(DataArray);
    

我的结果是:

["态度","交付/时间","态度","一般表现","其他","其他","个人计划"]

注意第一个、第二个和第三个值?这是怎么回事?

如果您在控制台“Attitude”="Attitude" 中执行此操作,则返回 true...

有什么想法吗?

提前致谢。

编辑: 以及带有 IE 的部分:

代码:

 var DataArray=['Other','Attitude','Attitude','Delivery/timings','General    Performance','Personal Planning','Other'];

 DataArray=DataArray.sort(function(a,b)
{
     return a<b;
 });

prompt('',DataArray);

结果(正确):个人计划,其他,其他,一般表现,态度,态度,交货/时机

代码:

var DataArray=['Other','Attitude','Attitude','Delivery/timings','General Performance','Personal Planning','Other'];

    DataArray=DataArray.sort(function(a,b)
    {
        return a>b;
    });

    prompt('',DataArray);

RESULT(不正确):态度、态度、其他、交货/时间安排、一般表现、其他、个人计划

解决方案:

sortableArray=sortableArray.sort(function(a,b)
                {
                    if(a.Category>b.Category)
                    {
                        return 1;
                    }

                    if(a.Category<b.Category)
                    {
                        return -1;
                    }

                    return 0;

                });

使用 reverse() 函数对数据进行降序排序。

感谢您的帮助。特别是@nnnnnn

【问题讨论】:

  • 可能不相关,但sort() 将就地对数组进行排序 - 您无需将其分配回变量。
  • 这是真的,但在我的实际情况中,我使用它来按属性对对象进行排序: sortableArray=sortableArray.sort(function(a,b) { return a.Category>b.Category; } );我刚刚调试了这个。
  • IE8没问题,结果是:["Attitude", "Attitude", "Delivery/timings", "General Performance", "Other", "Other", "Personal Planning"]。 (您可以使用此jsfiddle 进行测试)。
  • 请在发布前发布真实代码和RTFM。 sort 方法有据可查。

标签: javascript internet-explorer sorting opera


【解决方案1】:

这不是任何特定浏览器的问题,而是没有阅读.sort() function documentation 的问题。您传递给.sort() 的回调不应该返回布尔值,它应该返回一个数字:

  • 如果 a 在 b 之前,则为负
  • 0 如果 a 等于 b
  • 如果 a 在 b 之后为正

【讨论】:

  • 非常感谢。我认为这是一个浏览器问题,因为在 webkit 浏览器和 firefox 中,我对数据进行了正确排序。
  • 我想你会发现在其他浏览器中你得到预期的结果更多是靠运气。如果您只返回一个布尔值,它肯定不会适用于所有情况。
【解决方案2】:

您的排序函数返回一个布尔值,而它应该返回一个整数。虽然1 可能会混淆为true0false,但这不应该是您依赖代码逻辑的东西。该函数应该有 3 个返回案例:

  • &lt; 0 如果a &gt; b
  • &gt; 0 如果a &lt; b
  • == 0 如果a == b

所以你应该像这样对你的数组进行排序:

  DataArray = DataArray.sort(function(a,b){
      return a>b ? 1 : a<b ? -1 : 0;          
  });

这是working demo

【讨论】:

  • DataArray.sort(function (a, b) { return a - b; }); 当然,在这种情况下你可以简单地省略排序函数。
  • @PointedEars - a-b 技术是一个很好的捷径,仅适用于数字数据
  • @nnnnnn 正确,或用于可转换为Number 的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多