【问题标题】:sorting array of arrays using one of their indexes使用它们的索引之一对数组进行排序
【发布时间】:2018-06-16 18:32:46
【问题描述】:

我有一个包含不同值的数组,我想按其中一个索引中的数值对其进行排序

const arr = [
  ['foo', var, 5],
  ['fee', var, 7],
  ['faa', var, 3]
]

我想使用arr[2] 值对这个数组进行从大到小的排序。知道怎么做吗?

渴望的结果应该是:

const arr = [
  ['fee', var, 7],
  ['foo', var, 5],
  ['faa', var, 3]      
]

【问题讨论】:

    标签: javascript algorithm


    【解决方案1】:

    你可以像这样使用sort

    arr.sort((a,b) => {
      return a[2] < b[2] // To sort in descending order
      // return a[2] > b[2] // To sort in ascending order
    })
    

    例子:

    var arr = [
      ['foo', 'fifth', 5],
      ['fee', 'seventh', 7],
      ['faa', 'third', 3]
    ];
    
    var sortedArr = arr.sort(function(a,b){
      return a[2] < b[2]
    });
    
    console.log(sortedArr)

    排序功能的工作原理

    首先,我们假设这个数组:

    [1,2] // where a = 1, b = 2
    

    升序:

    a 是否大于 b?

    如果是,我们需要排序=>返回true

    否则,我们不需要排序 => 返回 false

    降序:

    a 是否小于 b?

    如果是,我们需要排序=>返回true

    否则,我们不需要排序 => 返回 false

    在前面的示例中,我们正在验证 a 是否小于 b,然后返回 true 以对其进行排序,否则返回 false,因为这已经是降序了。


    根据@Nina Scholz

    请不要返回布尔值进行排序,因为排序需要一个小于零、零或大于零的值。省略相等的情况实际上可能有效,但它会使算法更难对数组进行排序

    您应该考虑返回 0、1 或 -1。对于您的情况,您应该这样使用:

    arr.sort((a,b) => {
      if(a[2] < b[2]) return 1
      if(a[2] > b[2]) return -1
      if(a[2] === b[2]) return 0
    })
    

    此外

    如果值只是整数(不包含 Infinity 和 NaN),则可以简化如下,

    arr.sort((a,b) => b[2]-a[2])
    

    【讨论】:

    • 请不要返回布尔值进行排序,因为排序需要一个小于零、零或大于零的值。省略相等的情况实际上可能有效,但它使算法更难对数组进行排序。
    • 应该是arr.sort((a,b) =&gt; b[2] - a[2])。见stackoverflow.com/questions/24080785/…
    【解决方案2】:
    function bubbleSort(arr){
       var len = arr.length;
       for (var i = len-1; i>=0; i--){
         for(var j = 1; j<=i; j++){
           if(arr[j-1]<arr[j]){
               var temp = arr[j-1];
               arr[j-1] = arr[j];
               arr[j] = temp;
            }
         }
       }
       return arr;
    }
    
    console.log( bubbleSort([7,5,2,4,3,9]))
    

    console.log 输出为 9 7 5 4 3 2 修改代码以循环遍历 Array 中的 object.var

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-23
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多