2012-08-26 62 views
1

我正在学习JavaScript,无法找出下面我的代码中的问题。我想我误解了数组是如何工作的。排序数组的问题

问题是,警报数组实际上没有排序。我会很感激这方面的任何见解:

Here is a ready jsFiddle

HTML:

<html> 
    <head> 
    <title> 
     Test 1 
    </title> 
    <script src="http://code.jquery.com/jquery-latest.js" type= 
    "text/javascript"> 
</script> 
    </head> 
    <body> 
    <div class="items"> 
     <ul> 
     <li> 
      <a href="#" id="1">Link 1</a> 
     </li> 
     <li> 
      <a href="#" id="2">Link 2</a> 
     </li> 
     <li> 
      <a href="#" id="3">Link 3</a> 
     </li> 
     <li> 
      <a href="#" id="4">Link 4</a> 
     </li> 
     </ul> 
    </div> 
</body> 
</html> 

的Javascript:

var clickedLinks = []; 
var passedItems = []; 


// Collect clicked link IDs into an array and pass the array as an argument to shoplist() 
$('.items a').click(function() { 

if (clickedLinks.indexOf(this.id) != -1) { 
    var linkIndex = clickedLinks.indexOf(this.id); 
    clickedLinks.splice(linkIndex, 1); 
} else { 
    clickedLinks.push(this.id); 
} 

shoplist(clickedLinks); 

}); 


function shoplist(ids) { 
    passedItems.push(ids.slice()); 
    alert(passedItems.sort()); 
} 

重现步骤:

  1. 单击链接2
  2. 单击链接1

预期结果: 1,2,2

实际结果: 2,2,1

事情我已经尝试:

function shoplist(ids) { 
    passedItems.push(ids.slice()); 
    var newpi = passedItems.slice(); 
    alert(newpi.sort()); 
    } 
+0

您有一个数组的阵列。尝试不推送到传递的项目,但只排序点击链接 – mplungjan

回答

1

要添加数组,结果为ids.slice(),到另一个数组。这就是为什么这种排序不符合你的期望。使用concat相反,如果你想的ids内容添加到passedItems阵列:而不是添加一个字符串ids阵列

passedItems = passedItems.concat(ids); 

此外,你应该使用.push(parseInt(this.id))代替,然后使用:

passedItems.sort(function (a, b) { 
    return a - b; 
}); 
+0

如果我没有错,sort()方法将总是按字母顺序排序,无论你传递的是整数还是字符串。要进行数值排序,您需要将排序函数作为参数传递,请参阅http://stackoverflow.com/a/12133066/932210 – finspin

2

我想你'重新使用了sort function错误。如果你想使用数字排序功能,你必须包括一个排序功能。如果你想的东西数字排序,你应该使用这个功能(在提供的链接):

(function(a,b){return a-b}); 

所以在您的情况为newpi它是这样的:

newpi.sort(function(a,b){return a-b});