2009-09-30 61 views
1

barValues是我传递给函数的数组。在我有这个功能:javascript数组排序

alert(barValues); 

var sortedBarValues = barValues; 
sortedBarValues.sort(function(a,b){return b - a}); 

alert(barValues); 

我想结束了两个数组。 barValues是原始数组,sortedBarValues是该数组的副本,现在已排序。

但是,通过两个警报,我发现barValues也被排序。这是为什么?将数组的副本与原始数组分开排序的正确方法是什么?

回答

6

随着声明var sortedBarValues = barValues;,您没有制作数组的副本。你只是在做一个参考。这两个名称都指向相同的数组。

您可以用var sortedBarValues = barValues.slice();复制它。切片方法是用于切片数组,但如果您不传递任何参数,它将进行复制。

请记住,使用slice方法将无法在多维数组上正常工作。复制多维数组有点棘手,但jQuery的扩展函数可以为你做。

您可以在this post中看到有关如何复制数组的信息。

+1

谢谢,麦克。很好的解释。 – 2009-09-30 22:39:37

1

当你分配给barValuessortedBarValues实际分配到原Array一个参考。当您对sortedBarValues进行排序时,barValues也会被排序,因为它们实际上是完全相同的东西。

您需要在对数组进行排序之前制作数组的副本,以使其他数据不受影响。

var sortedBarValues = Array.apply({}, barValues); 
sortedBarValues.sort(function(a, b) { return b - a; }); 
+0

谢谢,亚历克斯。我要查看更多有关JavaScript参考的信息! – 2009-09-30 22:40:11

0
<html> 
<body> 

<h2>JavaScript Array Sort</h2> 

<p>The lowest number is <span id="demo"></span>.</p> 

<script> 
var points = [78, 78,99, 2, 5, 25, 10]; 
document.getElementById("demo").innerHTML = myArrayMin(points); 

function myArrayMin(arr) { 
    var len = arr.length 
    var min = Infinity; 
    while (len--) { 
     if (arr[len] < min) { 
     min = arr[len]; 
     } 
    } 
    return min; 
} 
</script> 

</body> 
</html> 

输出是2个