JS对象数组多条件排序

JavaScript09

JS对象数组多条件排序,第1张

JS数组多条件排序基于Array.sort()方法,首先要了解sort()方法的用法。

sort()方法可以传入一个函数作为参数,然后依据该函数的逻辑,进行数组的排序。

eg:

sort()方法接收函数作为参数时,排序主要根据传入函数的返回值是否大于0进行排序。

1)当 a-b <0时,则a元素排在b元素的前面;(a、b元素位置不变)

2)当a-b= 0时,a,b元素的位置不变;

3)当a-b >0时,则b元素排在a元素的前面。(a、b元素位置交换)

当数组元素为对象时,若要根据对象的多个属性进行排序,就涉及到多条件排序。

从给定的数据中,随机抽出一项,这项的左边放所有比它小的,右边放比它大的,然后再分别这两边执行上述操作,采用的是递归的思想,总结出来就是 实现一层,分别给两边递归,设置好出口

function fastSort(array,head,tail){

    //考虑到给每个分区操作的时候都是在原有的数组中进行操作的,所以这里head,tail来确定分片的位置

    /*生成随机项*/

    var randomnum = Math.floor(ranDom(head,tail))

    var random = array[randomnum]

    /*将小于random的项放置在其左边  策略就是通过一个临时的数组来储存分好区的结果,再到原数组中替换*/

    var arrayTemp = []

    var unshiftHead = 0

    for(var i = headi <= taili++){

      if(array[i]<random){

        arrayTemp.unshift(array[i])

        unshiftHead++

      }else if(array[i]>random){

        arrayTemp.push(array[i])

      }

      /*当它等于的时候放哪,这里我想选择放到队列的前面,也就是从unshift后的第一个位置放置*/

      if(array[i]===random){

        arrayTemp.splice(unshiftHead,0,array[i])

      }

    }

    /*将对应项覆盖原来的记录*/

    for(var j = head , u=0j <= tailj++,u++){

      array.splice(j,1,arrayTemp[u])

    }

    /*寻找中间项所在的index*/

    var nowIndex = array.indexOf(random)

    /*设置出口,当要放进去的片段只有2项的时候就可以收工了*/

    if(arrayTemp.length <= 2){

      return

    }

    /*递归,同时应用其左右两个区域*/

    fastSort(array,head,nowIndex)

    fastSort(array,nowIndex+1,tail)

  }

JavaScript实现多维数组、对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序。

sort() 方法用于对数组的元素进行排序。语法如下:

arrayObject.sort(sortby)

例如:

function NumAscSort(a,b)

{

 return a - b

}

function NumDescSort(a,b)

{

 return b - a

}

var arr = new Array( 3600, 5010, 10100, 801) 

arr.sort(NumDescSort)

alert(arr)

arr.sort(NumAscSort)

alert(arr)

//排序算法

window.onload = function(){

    var array = [0,1,2,44,4,

                324,5,65,6,6,

                34,4,5,6,2,

                43,5,6,62,43,

                5,1,4,51,56,

                76,7,7,2,1,

                45,4,6,7,8]

    //var array = [4,2,5,1,0,3]

    array = sorting.shellSort(array)

    alert(array)

}

var sorting = {

    //利用sort方法进行排序

    systemSort: function(arr){

        return arr.sort(function(a,b){

            return a-b

        })

    },

    //冒泡排序

    bubbleSort: function(arr){

        var len=arr.length, tmp

        for(var i=0i<len-1i++){

            for(var j=0j<len-1-ij++){

                if(arr[j]>arr[j+1]){

                    tmp = arr[j]

                    arr[j] = arr[j+1]

                    arr[j+1] = tmp

                }

            }

        }

        return arr

    },

    //快速排序

    quickSort: function(arr){

        var low=0, high=arr.length-1

        sort(low,high)

        function sort(low, high){

            if(low<high){

                var mid = (function(low, high){

                    var tmp = arr[low]

                    while(low<high){

                        while(low<high&&arr[high]>=tmp){

                            high--

                        }

                        arr[low] = arr[high]

                        while(low<high&&arr[low]<=tmp){

                            low++

                        }

                        arr[high] = arr[low]

                    }

                    arr[low] = tmp

                    return low

                })(low, high)

                sort(low, mid-1)

                sort(mid+1,high)

            }

        }

        return arr

    },

    //插入排序

    insertSort: function(arr){

        var len = arr.length

        for(var i=1i<leni++){

            var tmp = arr[i]

            for(var j=i-1j>=0j--){

                if(tmp<arr[j]){

                    arr[j+1] = arr[j]

                }else{

                    arr[j+1] = tmp

                    break

                }

            }

        }

        return arr

    },

    //希尔排序

    shellSort: function(arr){

        console.log(arr)

        var h = 1

        while(h<=arr.length/3){

            h = h*3+1  //O(n^(3/2))by Knuth,1973

        }

        for( h>=1h=Math.floor(h/3)){

            for(var k=0k<hk++){

                for(var i=h+ki<arr.lengthi+=h){

                    for(var j=ij>=h&&arr[j]<arr[j-h]j-=h){

                        var tmp = arr[j]

                        arr[j] = arr[j-h]

                        arr[j-h] = tmp

                    }

                }

            }

        }

        return arr

    }

}