Javascript数组排序更改索引

时间:2014-05-27 09:06:04

标签: javascript arrays sorting

HY,

当我对数组进行排序时,它会改变我的索引:

Myarray.sort(function (a, b) {
    //sort : http://www.javascriptkit.com/javatutors/arraysort2.shtml
    var nameA = a.name.toLowerCase(), nameB = b.name.toLowerCase()
    if (nameA < nameB) //sort string ascending
        return -1;
    if (nameA > nameB)
        return 1;
    return 0; //default return value (no sorting)
});
在我排序之前

array : "86", "85", "89"

排序后:

array : "0", "1", "2"

我想知道它是否正常。

如果我能改变它是否正常?

谢谢你的回答。

2 个答案:

答案 0 :(得分:1)

  在排序之前

array : "86", "85", "89"

看起来你有一个稀疏数组:一个长度为90的数组,其中的项目位于索引858689

  排序后,{p> array : "0", "1", "2"。这是正常的吗?

是。 sort会忽略不存在的属性(0 - 848788)。来自规范:

  

注意1 :因为不存在的属性值总是比大于undefined属性值,并且undefined总是比较大与任何其他值相比,undefined属性值始终排序到结果的末尾,后跟不存在的属性值。

  

我怎么能改变它?

你做不到。但是,除了那个之外没有其他任何理由,因为你想排序你的数组,这意味着重新排序这些项目。数组索引不是id。如果您的对象应该有id,请将它们设为属性:

var myArray = [
    {"id":"86", "target_area": {"name_area": "Loic"}},
    {"id":"85", "target_area": {"name_area": "aaaaaaaa"}},
    {"id":"81", "target_area": {"name_area": "zzzzzzzzzz"}}
];

当然,有一些解决方法,比如将值复制到不同的数组,对其进行排序并将它们移回稀疏数组 - 请参阅javascript sort sparse array keep indexes。但你似乎并不需要那样。

答案 1 :(得分:1)

您的代码按预期运行。 sort函数将始终从0开始对数组进行排序。当它找到元素(或占用的索引)时,它会递归地将它的索引移到数组的前面,直到它匹配另一个具有更高的值。

如果你想保留索引,你需要创建一个存储&#39;以前占据的指数。

我创建了一个jsFiddle来执行此操作。

<强>功能

function sortToIndices(arr){
    var occupiedIndices = [],
        objectCollection = [];

    for(var i = 0; i < arr.length; i++) {
        if(arr[i] != null){ // You may want to make this condition more strict
            occupiedIndices.push(i);
            objectCollection.push(arr[i]);
        }
    };

    objectCollection.sort(function(a, b) {
        var nameA = a.target_area.name_area.toLowerCase(), 
            nameB = b.target_area.name_area.toLowerCase();
            if (nameA < nameB) //sort string ascending
                return -1;
            if (nameA > nameB)
                return 1;
            return 0; //default return value (no sorting)
    });

    for (i = 0; i < occupiedIndices.length; i++) {
        arr[occupiedIndices[i]] = objectCollection[i];
    };       
}