js 数组排序

米阳 2020-1-17 562 1/17

项目中常遇到处理数据排序的问题

数组对象排序

var arr = [
    { val:"张三", id:8 },
    { val:"李四", id:10 },
    { val:"小王", id:9 }
];
//比较函数
function sortFn(key){ 
    return function(m,n){
        var a = m[key];
        var b = n[key];
        //升序 a - b  降序  b - a 
        return a - b; 
    }
}
arr.sort(sortFn("id"));
console.log(arr); 
//结果如下: 
 [{ val:"张三", id:8 },
 { val:"小王", id:9 },
 { val:"李四", id:10 }]

除了用sort排序 顺便总结一下js中数组的几种排序方式 (要看动画演示点击这里

1、选择排序

第一次循环找到最大或最小放到首位,再找剩下的里面找到次小或大的,依次循环完成排序

for(var i=0;i<arr.length;i++){
  for(var j=i+1;j<arr.length;j++){
    //如果前一个比后一个大,就换位置
    if(arr[i]>arr[j]){
	var temp = arr[i];
	arr[i] = arr[j];
	arr[j] = temp;
    }
  }
}

2、冒泡排序

每次比较连个相邻的数,这样比较第一次能把最大或者最小的排在最后一位,之后就循环比较完成排序

for(var i=0; i<arr.length-1; i++){
  for(var j=0; j<arr.length-1-i; j++){
    //如果第一个比第二个大,就交换他们两个位置
    if(arr[j]>arr[j+1]){
      var temp = arr[j];
      arr[j] = arr[j+1];
      arr[j+1] = temp;
    }
  }
}

3、插入排序

将数组第一个元素看做标准值,把第二个元素到最后一个元素当成是未排序序列。

// 从下标1开始 循环遍历无序数组
    for(let i = 1; i < arr.length; i++){
        // 假设数组前i项都是有序状态 
        // 并且将p指向有序数组中的最后一个元素
        let p = i - 1; 
        
        // 那么此时新元素就是有序数组中最后一个元素的下一个元素
        const new_val = arr[p+1];
        
        // 眼熟的 while 循环
        while(new_val < arr[p]){
            arr[p+1] = arr[p];
            p--;
        }
        arr[p+1] = new_val
    }

4、快速排序

function quickSort(arr){
    if(arr.length<= 1){return arr}
    let pivotIndex = Math.floor(arr.length/2)
    let pivot = arr.splice(pivotIndex,1)[0]
    let right =[]
    let left = []
    for ( let i = 0 ;i <arr.length ; i ++){
        if(arr[i]<pivot){
            left.push(arr[i])
        }else{
            right.push(arr[i])
         }
    }
      return quickSort(left).concat([pivot],quickSort(right))
}

 

- THE END -
Tag:

米阳

6月24日15:45

最后修改:2024年6月24日
0

非特殊说明,本博所有文章均为博主原创。