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"
我想知道它是否正常。
如果我能改变它是否正常?
谢谢你的回答。
答案 0 :(得分:1)
在排序之前,
array : "86", "85", "89"
看起来你有一个稀疏数组:一个长度为90
的数组,其中的项目位于索引85
,86
和89
。
排序后,{p> array : "0", "1", "2"
。这是正常的吗?
是。 sort
会忽略不存在的属性(0
- 84
,87
,88
)。来自规范:
注意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];
};
}