[英]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
在指数中的项目85
, 86
和89
。
在我排序之后,
array : "0", "1", "2"
。 这正常吗?
是。 不存在的属性( 0
- 84
, 87
, 88
)是由忽略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.