js对象数组按属性快速排序

前一篇《关于selector性能比赛》中提到,目测觉得在$("div,p,a")这样有逗号时,sizzle耗时异常(600多个元素,花了200ms),说是它可能没有优化ie下的排序。
按所推荐的程序在IE下跑了下,的确,排序耗时很小。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

/*

* 快速排序,按某个属性,或按“获取排序依据的函数”,来排序.

* @method soryBy

* @static

* @param {array} arr 待处理数组

* @param {string|function} prop 排序依据属性,获取

* @param {boolean} desc 降序

* @return {array} 返回排序后的新数组

*/

var sortBy =function (arr, prop, desc){

    var props=[],

    ret=[],

    i=0,

    len=arr.length;

    if(typeof prop==‘string‘) {

        for(; i<len; i++){

            var oI = arr[i];

            (props[i] = new String(oI && oI[prop] || ‘‘))._obj = oI;

        }

    }

    else if(typeof prop==‘function‘) {

        for(; i<len; i++){

            var oI = arr[i];

            (props[i] = new String(oI && prop(oI) || ‘‘))._obj = oI;

        }

    }

    else {

        throw ‘参数类型错误‘;

    }

    props.sort();

    for(i=0; i<len; i++) {

        ret[i] = props[i]._obj;

    }

    if(desc) ret.reverse();

    return ret;

};

Array原生的sort,当它传一个比较函数时,由于它内部用哪种排序算法,都需要多次比对,所以,耗时是很自然的事。
上面的快速排序,它并没有多次比对,
而是:
1。取出el属性值,用属性值产生一个String对象,
2。将el附在String对象上。
3。用String对象组成数组。
4。用原生的sort进String对象数组排序。
5。在排好序的String数组中,按序取出el。
即得到排好序的el数组。

js对象数组按属性快速排序

时间: 2024-11-10 11:05:10

js对象数组按属性快速排序的相关文章

js对象字面量属性间相互访问的问题 和 这个问题与执行环境的关系

对象字面量属性间无法相互访问的问题: 我曾经在定义一个对象时, 并出于复用性的考虑试图复用某些属性: // test 1 var person = { firstName : "Bill", lastName : "Gates", fullName : firstName + " " + lastName // 这里报错 } alert(person.firstName); alert(person.lastName); alert(person

JS 对象数组Array 根据对象object key的值排序sort,很风骚哦

有个js对象数组 var ary=[{id:1,name:"b"},{id:2,name:"b"}] 需求是根据name 或者 id的值来排序,这里有个风骚的函数 函数定义: function keysrt(key,desc) {   return function(a,b){     return desc ? ~~(a[key] < b[key]) : ~~(a[key] > b[key]);   } } 使用: var ary=[{id:1,nam

js对象可扩展性和属性的四个特性(下)

# js对象可扩展性和属性的四个特性(下) 一.前言 再次花时间回顾一下基础,毕竟要想楼建的好,地基就要牢固,嘻嘻! 在开始之前需要具备对prototype.__proto__.constructor有一定得了解,可以看看我之前写的一篇文章=>通道 之前的用户管理系统已经差不多了,顺便加了个socket聊天的,但是由于做java后台的哪个朋友节奏跟不上来,所以即时聊天的后台就是node+socket-io写的,由于用户列表也涉及比较多的用户隐私问题,所以我设置了页面权限和接口权限,然后下面开放的

js 对象数组去重问题

在项目中定义对象数组是非常常见的,这就免不了要对对象数组进行去重.当然不能简单的使用===来解决问题,因为这时候数组中的类型为对象类型,即使完全相同的两个对象也不相等的.下面的例子说明一切: {}==={}//fasle []===[]//fasle 所以应该使用其他方法来判断两个对象是否相等,能代表这个对象的唯一性的属性,比如id. 使用id举例: var arr=[ {id:01,name:'jack'}, {id:02,name:'tome'}, {id:01,name:'jack'},

js 对象数组的交集补集和并集

先易后难,先对最简单的一维数字数组求交并补 var a=[1,2,3,5,6]; var b=[1,2,6,7,8] // 交集 a.filter(item=>b.includes(item)); // 并集 [...new Set(a.concat(b))] // 补集 a.filter(item=>!b.includes(item)); 对象数组也相差无几,每个对象都有一个唯一的标识的id var a=[ {id:'001',name:'zhangsan'}, {id:'002',name

valueForKeyPath获取对象数组的属性

1 [self.groups valueForKeyPath:@"name"] 指groups 是一组group对象的数据,group对象里name的属性 那么上面的意思就是返回每个group对象里name属性的值 [group valueForKey:@"name"] 指是返回这个group对象里的name属性值 2 setValuesForKeysWithDictionary  通过字典给对象的属性赋值

前端串js对象数组给php 所用框架thinkphp

//js 对象 <script>     person[]=new Object();     person[0].firstname="Bill";     person[0].lastname="Gates";      person[1].firstname="Bill";     person[1].lastname="Gates";     //将对象转为json字符串     var jsonstr=J

js对象数组(JSON) 根据某个共同字段 分组

希望的是将下面的对象数组: [ {"id":"1001","name":"值1","value":"111"}, {"id":"1001","name":"值1","value":"11111"}, {"id":"1002",&q

js 对象数组根据对象中的属性排序

function createComparisonFunction(propertyName){ return function(object1,object2){ var value1 = object1[propertyName]; var value2 = object2[propertyName]; if(value1 < value2){ return -1; }else if(value1 > value2){ return 1; }else{ return 0; } }; };