【问题标题】:JavaScript, array.sort() two arrays based on only one of themJavaScript, array.sort() 两个数组只基于其中一个
【发布时间】:2013-07-02 01:37:14
【问题描述】:

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

我会为内置排序写什么来完成相同的工作?

【问题讨论】:

  • 您可以对对象数组进行排序...(而 w3school 不是很好。作为参考,您可能希望看到 Array.sort on MDN 代替)
  • 我同意,如果您将两个值都存储在一个对象中,那么您可以简单地使用sort
  • rowCategories[] 是一个对象数组(我认为它是一个类),所以我应该让rowWidth[] 成为它的一部分?
  • 是的,只需为每个元素添加一个width: 属性。
  • 是的,如果可能,我会使用这种方法。

标签: javascript arrays sorting


【解决方案1】:

有一种对数组进行多重排序的方法,但我更喜欢对象数组。这是多重排序:

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!),但我认为将rowWidth[] 添加到rowCategories[] 的建议是一个更简单的解决方案,谢谢
  • @asimes 我已经添加了按对象键排序,如果您有任何问题,请告诉我。
  • 多重排序是我不久前在 SO 上看到的一些代码。这不是我的,但找不到原始帖子。
【解决方案2】:

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

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

对象必须包含属性 rowWidth 和 rowCatagories

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我想这与它是一个端口的事实有关,但是耶稣这个函数是一些可怕的可怕的 js 代码。
    【解决方案4】:

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

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

    你可以用这个排序函数代替你的,这样会快得多。

    【讨论】:

    • 你将如何将它用于他正在实现的双数组排序?
    • 他能做的是创建由一对rowCategoriesrowWidth组成的数组,然后在函数中分别更改值。
    • 我猜他们都使用 Mergesort 或 Quicksort?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2015-06-08
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2021-07-22
    相关资源
    最近更新 更多