Javascript OrderBy

要在js 实现orderBy
基本知识就是 array.sort
array.sort(function(a,b){
 a 表示 row 0
 b 表示 row 1 
它会loop多次
你可以比较 if(a > b) return 1 
做出一个return , return 的结果 >0 代表你要这2个row对换位置 
})

要实现orderBy呢
逻辑就是在比较的时候如果出现一样值,你要拿接下来的column做对比,直到完结!是一种梯归手法 
if(a > b) return 1
else (a < b) return -1 
else
{
平手 
var a = row1["color"] //换下一个column的值对比
var b = row2["color"]
  if(a > b) return 1 
else if ..
else ...
又平手再循环...
}
sort 是游览器自带的功能。它的sort法法我不知道,排序本来就有很多很多种方法。(但可以支持上面的思想!这样很不错)。
一般我们对orderBy的思想可能是先sort 第一次,然后把相同的分层多个part ,在每个层sort 一次,一直这样循环 。 这其实是错误的。
在第一次loop时就要把逻辑给进去。一次sort 完成就可以了。

下面上一段代码,基本上可以用,只是要修改一些基本函数的依赖。

    //orderBy array是引用哦
    Array.prototype.orderBy = function (conditionList) {
        conditionList = facade_(conditionList);
        //一个外观处理
        //上层调用:
        //array.orderBy()顺序(not support value object|array)
        //array.orderBy("-")逆序(not support value object|array)
        //array.orderBy("code,-color,size") - 代表desc code代表attr (not support 有2中valueType的)
        //array.orderBy("0,-1,2") 0代表 array index (not support 有2中valueType的)
        function facade_(para) {
            //如果para 完全没有
            if (para === undefined) {
                return [{}]; //顺序,只能处理 value not array|object
            }
            else if (G.isString(para)) {
                var split = para.split(",");
                var conditionList = [];
                split.forEach(function (value) {
                    var condition = {};
                    var firstChar = value.charAt(0);
                    if (firstChar === "-") {
                        condition.numberSort = "desc";
                        value = value.substring(1);
                    }
                    if (value != "") {
                        if (G.canBeNumber(value)) {
                            value = +value;
                        }
                        condition.sortKey = value; //试图转去number
                    }
                    conditionList.push(condition);
                });
                return conditionList;
            }
        }
        //API : 调用
        //var result = array.orderBy([{ sortKey, numberFirst, numberSort, otherSort }]) 只区分是number or not number
        //sortKey : attr 或者 array的i , 没有代表value不是array|object
        //numberFirst : true|false, default 是true , 当value有不同类型,时候number排在前面
        //numberSort : "desc"|"" default 是 "" 如果要desc,这是必填!
        //otherSort : "desc"|"" default 是 "" , 如果只有一种类型,那么就只用numberSort就可以了
        //逻辑规则,length = 0 error
        //value 是对象或array就一定有 conditionList[0].sortKey
        //value 是对象或array, 结构一定要一样,比如长短或attr
        //精华 :
        //array.sort(function(a,b){})
        //a,b 代表row
        //return > 0 代表要转
        var loop = function (v1, v2, conditionList, conditionIndex) {
            var result;
            var condition = conditionList[conditionIndex];
            //处理value
            var a = v1, b = v2;
            var sortKey = condition.sortKey;
            if (sortKey !== undefined) {
                a = v1[sortKey];
                b = v2[sortKey];
            }
            //区分 valueType
            var typeA = G.s.fn.myTypeOf(a);
            var typeB = G.s.fn.myTypeOf(b);
            if (typeA === typeB) {
                result = (condition.numberSort === undefined || condition.numberSort !== "desc") ? 1 : -1; //这个是给number的
                if (typeA !== "number" && condition.otherSort !== undefined) {
                    result = (condition.otherSort !== "desc") ? 1 : -1;
                }
                if (a > b) {
                    return result; //return 1 代表转
                }
                else if (a < b) {
                    return -result;
                }
                else {
                    //打平手的话梯归比下一个,当有多个orderBy
                    conditionIndex++;
                    if (conditionList[conditionIndex] !== undefined) {
                        return loop(v1, v2, conditionList, conditionIndex); //梯归
                    }
                    else {
                        return 0;
                    }
                }
            }
            else {
                //类型不同不能比,就看number要不要去前面就好
                result = (condition.is_numberFirst === undefined || condition.is_numberFirst === true) ? -1 : 1;
                if (typeA === "number") return result; //a 是number , 如果你要number在前就不要转 -1
                return -result;
            }
        };
        this.sort(function (v1, v2) {
            return loop(v1, v2, conditionList, 0);
        });
        return this;
    };

简单的可以这样调用 :

array.orderBy()顺序(not support value object|array)
array.orderBy("-")逆序(not support value object|array)
array.orderBy("code,-color,size") - 代表desc code代表attr (not support 有2中valueType的)
array.orderBy("0,-1,2") 0代表 array index (not support 有2中valueType的)

Javascript OrderBy

时间: 2024-10-08 14:15:35

Javascript OrderBy的相关文章

让C#可以像Javascript一样操作Json

Json的简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C.C++.C#.Java.JavaScript.Perl.Python等).这些特性使JSON成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率). 来自百度百科的介绍 Json的优点 数据格式比较简单,易于读写,格式都是压缩

淡扯javascript编程思想

一.面向对象-OOD   虽然js面向对象的编程思想已经老话常谈了,但了为了文章的完整性,我还是把它加了进来,尽量以不太一样的方式讲述(虽然也没什么卵不一样的). 1.面向对象,首先得有类的概念,没有类造不出来对象,但是javascript中又没有类 只有函数的感念,把以大写字母命名的函数看成创建对象的构造函数,把函数名看成类,那么就可以new一个对象了 //1.1 无参的 function People() { } var p = new People(); //javascript为解释性语

JavaScript总结—数组

Array类型 ECMAScript数组的每一项可以保存任何类型的数据. 创建数组的两种方式: (1)使用Array()构造函数 var colors = new Array(20); var colors = new Array("red","blue","green"); (2)数组字面量表示法 var colors = ["red","blue","green"]; 修改.新增 v

LINQ to JavaScript

JSLINQ 是一个将LINQ对象转化为JavaScript对象的工具 .它是构建在JavaScript的数组对象的基础上进行转换的,如果您使用的是一个数组,你可以使用LINQ到javascript . 示例: var myList = [ {FirstName:"Chris",LastName:"Pearson"}, {FirstName:"Kate",LastName:"Johnson"}, {FirstName:&quo

JavaScript 框架------------AngularJS(上)

一.简单了解一下AngularJS AngularJS 是一个 JavaScript 框架.它可通过 <script> 标签添加到 HTML 页面. AngularJS 通过 指令 扩展了 HTML,且通过 表达式 绑定数据到 HTML. AngularJS 是一个 JavaScript 框架.它是一个以 JavaScript 编写的库. AngularJS 是以一个 JavaScript 文件形式发布的,可通过 script 标签添加到网页中: <script src="Js

AngularJS学习--- AngularJS中数据双向绑定(two-way data-binding) orderBy step4

1.切换工作目录 git checkout step-4 #切换分支,切换到第4步 npm start #启动项目 2.代码 app/index.html Search: <input ng-model="query"> Sort by: <select ng-model="orderProp"> <option value="name">Alphabetical</option> <opti

对JavaScript对象数组按指定属性和排序方向进行排序

引子 在以数据为中心的信息系统中,以表格形式展示数据是在常见不过的方式了.对数据进行排序是必不可少的功能.排序可以分为按单个字段排序和按多个字段不同排序方向排序.单字段排序局限性较大,不能满足用户对数据的关注点变化的需求,而多字段排序就可以较好的弥补这个缺陷. 多字段排序,实现的方式从大的层面上可以分为后端实现和前端实现. 后端排序 后端实现排序可以在数据库层面实现或者在应用程序层面实现. 数据库层面实现多字段排序非常简单,使用SQL的排序指令“Order By”即可——Order By fie

Javascript Promise 学习

Promise 就是处理异步的一个规范方法 a();b();alert("a");如果a() 里面有一个ajax 或者settimeout 那么alert("a") 会先跑这就是异步了.从前我们用一堆callBack函数来解决问题,但是这样写不好看.promise 的写法美丽多了依据上面的例子a().then(b).then(function(){alert("");})这样它会先跑完 a -> b - > alert("&

wg_listToTree小插件 用 javascript 将List数组转换为Tree

简介: 树形菜单在b/s编程中经常碰到,但是并不是每个tree插件都支持List类型的json数据,同时由于后台转换并不如前端节省资源,所以作此插件; 主要功能: 1.可以自定义属性名称; 2.可以多字段排序; 注意:此插件无去重复功能,所以数据可能重复的,请自行去重复之后再行使用; 示例: <html> <script type="text/javascript" src="wg_listToTree1.1.js"></script&