2013-07-18 50 views
1

我想获得一个简单的排序工作的对象数组,但它似乎是返回完全随机的结果。请看看这个普拉克(在FF或Chrome)JavaScript的对象数组排序返回随机结果

http://plnkr.co/edit/TqoyUJV4nzvC4hAkVRkz?p=preview

var data; 
    var asc; 

    function init(){ 
     data = [{username:"leonhaas"},{username:"0johnson"},{username:"leonlang"},{username:"0lechner"},{username:"0koller"},{username:"leonwinkler"},{username:"0schmidt"},{username:"0mueller"},{username:"0schmid"},{username:"lillyfuchs"},{username:"alexandragruber"},{username:"alexanderlechner"},{username:"alexanderpichler"},{username:"alexandraeder"},{username:"lillyreiter"},{username:"alibauer"},{username:"alexandrahall"},{username:"alexandrajohnson"},{username:"alexandrataylor"},{username:"alexandrawilliams"},{username:"lilywinkler"},{username:"alinabauer"},{username:"aliceegger"},{username:"alicesteiner"},{username:"alicewallner"},{username:"aliegger"},{username:"alifuchs"},{username:"linajohnson"},{username:"amarwhite"},{username:"alinaleitner"},{username:"alinaschmidt"},{username:"alinawood"},{username:"alischneider"}]; 
     outputData(data); 
     asc = true; 
    } 

    function sortIt() 
    { 
     a = data.username; 
     b = data.username; 
     if(asc){ 
      data.sort(function(a,b) 
      { 
       return 1; 
      }); 
     } else { 
      data.sort(function(a,b) 
      { 
       return -1; 
      }); 
     } 

     outputData(data); 
    } 

    function outputData(data){ 
     var output = ""; 
     data.forEach(function (item){ 
      output += item.username +"<br>"; 
     }); 

     var x=document.getElementById("demo"); 
     x.innerHTML=output; 
    } 

回答

4

在你的排序功能,你要比较的数据对象用户名:

function sortIt() 
{ 
    if(asc){ 
     data.sort(function(a,b) 
     { 
      return a.username.localeCompare(b.username); 
     }); 
    } else { 
     data.sort(function(a,b) 
     { 
      return b.username.localeCompare(a.username); 
     }); 
    } 

    outputData(data); 
} 
+0

谢谢!同时我发现了另一种方式:data.sort(function(a,b) var x = a ['username'],y = b ['username']; return(x == y? 0:(x> y?1:-1)); }); –

0

您应该返回从排序功能基础上,条件的值,而不只是1或-1。像这样...

// Inside your script.js. Line #14 
if(asc){ 
    data.sort(function(a,b) 
    { 
     return a>b ? 1 : -1; 
    }); 
} else { 
    data.sort(function(a,b) 
    { 
     return a>b ?-1 : 1; 
    }); 
} 
1

一对夫妇的事情,你不排序的数组,你需要返回0如果值相同,则取决于升序/降序排序,然后是-1(或1)。
除此之外,您在sortIt函数中分配了var avar b,这足够了,但这些不是您在sort回调中使用的值。因为回调的参数是相同的名称,所以它们掩盖了较高范围的ab变量。

所有的事情考虑,排序回调应该是这样的:

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

所有的事情考虑,你的代码可以与很多工作要做:你使用全局变量所有的地方,你的sortIt函数将在每次调用中重新声明排序回调函数,您在HTML中绑定事件处理程序(最好在JS中管理JS侦听器,排序 - 单一响应性原则),调用可能受益于实际相关调用上下文等的函数... look into IIFE's to create closures作为开始,并且书签MDN

0
function sortIt() 
    { 
     a = data.username; 
     b = data.username; 
     if(asc){ 
      data.sort(function(a,b) 
      { 
       if(a.username.localeCompare(b.username) > 0) 
       return 1; 
       else 
       return -1; 
      }); 
     } else { 
      data.sort(function(a,b) 
      { 
       if(b.username.localeCompare(a.username) > 0) 
       return 1; 
       else 
       return -1; 
      }); 
     } 

     outputData(data); 
    } 
+1

不需要if/else,只需'返回a.username.localeCompare(b.username)' – georg

0
 data = [{username: "leonhaas"},...]; 

     var asc = true; 

     data.sort(function(a, b) { 
      if (asc) 
       return a.username > b.username ? 1 : -1; 
      else 
       return a.username > b.username ? -1 : 1; 
     }); 

     for (var i = 0; i < data.length; i++) { 
      console.log(data[i].username); 
     }