【问题标题】:Unexpected error when sorting an array in Javascript [duplicate]在Javascript中对数组进行排序时出现意外错误[重复]
【发布时间】:2014-04-27 09:30:41
【问题描述】:

我正在尝试在 Javascript 中对数组进行排序,但出现了问题,我不知道为什么。问题是输出错误,因为某些数组元素被标记为“未定义”,在我调用 myFunc 函数后没有任何值。我希望看到的是按降序排序的元素。但是,我得到了一些带有“未定义”文本的字段。

这里是 Javascript 代码:

var arr = [1, 123, 2, 321, 341, 2];
/*var arr = [];
arr[0] = 1;
arr[1] = 123;
arr[2] = 2;
arr[3] = 321;
arr[4] = 341;
arr[5] = 2;*/

function selectionsort(){
    var n = 6;
    for(var i=0; i<n-1; i++)
    {
        var index = i;
        for(var j=i+1; j<n; j++)
        {
            if(arr[index]<arr[j])
            {
                index = j;
            }
        }
        console.log(arr[index]);
        if(index != i)
        {
            var temp = arr[j];
            arr[i] = arr[index];
            arr[index] = temp;
        }
    }
}

function initFunc()
{
        document.getElementById("asdf").innerHTML = arr[0];
        document.getElementById("asdf1").innerHTML = arr[1];
        document.getElementById("asdf2").innerHTML = arr[2];
        document.getElementById("asdf3").innerHTML = arr[3];
        document.getElementById("asdf4").innerHTML = arr[4];
        document.getElementById("asdf5").innerHTML = arr[5];

        document.getElementById("demoto+0").innerHTML = arr[0];
        document.getElementById("demoto+1").innerHTML = arr[1];
        document.getElementById("demoto+2").innerHTML = arr[2];
        document.getElementById("demoto+3").innerHTML = arr[3];
        document.getElementById("demoto+4").innerHTML = arr[4];
        document.getElementById("demoto+5").innerHTML = arr[5]; 
}

function myFunc(){  
        document.getElementById("demoto+0").innerHTML = arr[0];
        document.getElementById("demoto+1").innerHTML = arr[1];
        document.getElementById("demoto+2").innerHTML = arr[2];
        document.getElementById("demoto+3").innerHTML = arr[3];
        document.getElementById("demoto+4").innerHTML = arr[4];
        document.getElementById("demoto+5").innerHTML = arr[5];     

        selectionsort();

        document.getElementById("asdf").innerHTML = arr[0];
        document.getElementById("asdf1").innerHTML = arr[1];
        document.getElementById("asdf2").innerHTML = arr[2];
        document.getElementById("asdf3").innerHTML = arr[3];
        document.getElementById("asdf4").innerHTML = arr[4];
        document.getElementById("asdf5").innerHTML = arr[5];
}

这就是被操纵的 html 页面:

<button type="button" onclick="myFunc()">click</button>
<div class="wrapper">
            <div class="order">
            <ul id="boxes">
            <li><div id="demoto+0" class="transperant"></div></li>
            <li><div id="demoto+1" class="transperant"></div></li>
            <li><div id="demoto+2" class="transperant"></div></li>
            <li><div id="demoto+3" class="transperant"></div></li>
            <li><div id="demoto+4" class="transperant"></div></li>
            <li><div id="demoto+5" class="transperant"></div></li>
            </ul>
            </div>
        <br>
            <div class="order2">
            <ul id = "boxes">
            <li><div id="asdf" class="transperant">S</div></li>
            <li><div id="asdf1" class="transperant">S</div></li>
            <li><div id="asdf2" class="transperant">S</div></li>
            <li><div id="asdf3" class="transperant">S</div></li>
            <li><div id="asdf4" class="transperant">S</div></li>
            <li><div id="asdf5" class="transperant">S</div></li>
            </ul>
            </div>
        </div>

【问题讨论】:

    标签: javascript php jquery arrays sorting


    【解决方案1】:

    您真的需要重新发明*吗?只需使用

    [1, 123, 2, 321, 341, 2].sort(function(a,b){return a-b;});
    

    【讨论】:

    • 重新发明*并不重要:要对一组数字条目进行排序,有比使用 sort 更快的方法。
    • 大多数用例中的微优化。万恶之源。
    • @MaxArt 好吧,您总是可以探索其他排序算法,例如 blog.mgechev.com/2012/11/24/…,但我怀疑您是否会从这样一个小/微不足道的数组中获得任何收益。
    • @KooiInc 确实,该数组很短,可以显示任何明显的好处。现在我更仔细地查看代码,它总是有 6 个元素。
    • 大家明白我为什么使用选择排序 --> *.com/questions/23322530/…
    【解决方案2】:

    你可以在你的数组上使用 sort() 方法。像这样: arr.sort()

    【讨论】:

    • 是的,但我不认为问题出在排序功能上,因为它在其他情况下也有效。而且我不想使用排序功能。
    • 你为什么不想使用它?
    • JavaScript 数组本质上很慢,在您的情况下,您需要对多达 100 个值进行排序,使用 ffast 排序算法是多余的,因为您保存的迭代不能弥补每次迭代的权重.
    • 只是调用sort 并不能解决问题。请参阅 Kooilnc 的回答。
    • 大家明白我为什么使用选择排序 --> *.com/questions/23322530/…