我刚刚发现array.sort()
并看到我可以指定如何排序:(来自http://www.w3schools.com/jsref/jsref_sort.asp的示例)
var points = [40,100,1,5,25,10];
points.sort(function(a,b){return a-b});
我一直在使用冒泡排序手动进行排序,因为数组很小,但我想知道是否可以使用array.sort()
代替这个:
// Sort rowCategories[i] by rowWidth[i]
swapped = true;
while (swapped) {
swapped = false;
for (var i = 0; i < rowCategories.length-1; i++) {
if (rowWidth[i] < rowWidth[i+1]) {
var swap = rowCategories[i];
rowCategories[i] = rowCategories[i+1];
rowCategories[i+1] = swap;
swap = rowWidth[i];
rowWidth[i] = rowWidth[i+1];
rowWidth[i+1] = swap;
swapped = true;
}
}
}
我会为内置排序写什么来做同等的工作?
答案 0 :(得分:2)
有一种多排序数组的方法,但我更喜欢对象数组。这是多种类型:
function multisort(sortBy,otherArrays){
var keys=[],i,tmpKeys;
sortBy.sort(function(a,b){
var ret=(a>b)?1:(a<b)?-1:0;
// storing the return values to be used for the other arrays
keys.push(ret);
return ret;
});
for(i=0;i<otherArrays.length;i++){
// copy the stored retun values
tmpKeys=keys.concat([]);
otherArrays[i].sort(function(){
// return the saved values based on sortBy array's sort
return tmpKeys.splice(0,1);
});
}
}
var arr1=[1,2,3],
arr2=[5,6,7],
reverse=["c","b","a"];
multisort(reverse,[arr1,arr2])
console.log(arr1);
console.log(arr2);
console.log(reverse);
按对象键排序:
var arr=[
{id:1,col1:3,col2:2},
{id:2,col1:2,col2:2},
{id:3,col1:1,col2:1}
];
function sortBy(arr,keys){
var i=0;
arr.sort(function(a,b){
var i=0;
while(a[keys[i]]===b[keys[i]]&&i<keys.length){
i++;
}
return (keys.length===i)?0:(a[keys[i]]>b[keys[i]])?1:-1;
});
}
//sort by col2 then col1
sortBy(arr,["col2","col1"]);
console.log(arr);
//sort by id
sortBy(arr,["id"]);
console.log(arr);
答案 1 :(得分:1)
答案 2 :(得分:1)
这只需要稍加修改。而不是存储两个数组存储一个具有两个属性的对象的数组。然后你可以做这样的事情。
arr.sort(functiona(a,b){return a.rowWidth - b.rowWidth});
该对象必须包含属性rowWidth和rowCatagories
答案 3 :(得分:0)
实际上sort函数使用的vanilla依赖于浏览器JS引擎实现,例如Mozilla使用MergeSort我相信。
默认情况下,它将数组项目作为字符串进行比较,如果您需要任何其他考虑因素,则必须将自己的比较函数传递给sort并且函数必须返回负数,0或正数表示项目比较结果。
您可以使用此排序功能而不是您的功能,这会更快。