3

我刚刚发现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;
        }
    }
}

我会为内置排序写什么来做同样的工作?

4

4 回答 4

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);
于 2013-07-02T01:54:45.740 回答
1

内置sort()一次只能对一个数组进行排序,并且比较基于值,而不是索引。

你所做的类似于 PHP 的array_multisort()功能。如果您使用加载php.js库,它包含此函数的实现。实施在这里

于 2013-07-02T01:45:54.687 回答
1

这只需要一点点修改。不是存储两个数组,而是存储一个数组和一个具有两个属性的对象。然后你可以做这样的事情。

arr.sort(functiona(a,b){return a.rowWidth - b.rowWidth});

该对象必须包含属性 rowWidth 和 rowCatagories

于 2013-07-02T01:48:51.350 回答
0

实际上,排序功能使用的香草取决于浏览器 JS 引擎的实现,例如我相信 Mozilla 使用 MergeSort。

默认情况下,它将数组项作为字符串进行比较,如果您需要任何其他考虑,您必须将自己的比较函数传递给排序,并且函数必须返回负数、0 或正数,指示项目比较结果。

您可以使用此排序功能代替您的,这样会快得多。

于 2013-07-02T01:45:21.403 回答