繁体   English   中英

Javascript数组排序更改索引

[英]Javascript array sorting change index

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"

我想知道这是否正常。

如果是正常的,我该如何改变呢?

谢谢您的回答。

在我排序之前, array : "86", "85", "89"

看起来你有稀疏数组:长度的数组90在指数中的项目858689

在我排序之后, array : "0", "1", "2" 这正常吗?

是。 不存在的属性( 0 - 848788 )是由忽略sort 从规格:

注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稀疏数组保持索引 不过,您似乎不需要。

您的代码表现正常。 sort函数将始终对从0开始的数组进行排序。当找到元素(或占用的索引)时,它将以递归方式将其索引移到数组的前面,直到与另一个具有更高值的元素匹配为止。

如果要保留索引,则需要创建一个“存储”先前占用的索引的函数。

我创建了一个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];
    };       
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM