栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

JavaScript如何按多个字段对对象数组排序?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JavaScript如何按多个字段对对象数组排序?

这是一个“优化”版本。它进行了更多的预处理,并为每个排序选项预先创建了比较功能。它可能需要更多的内存(因为它为每个排序选项存储了一个功能,但是它应该执行得更好一些,因为在比较过程中不必确定正确的设置。尽管如此,我也没有进行任何分析。

var sort_by;(function() {    // utility functions    var default_cmp = function(a, b) { if (a == b) return 0; return a < b ? -1 : 1;        },        getCmpFunc = function(primer, reverse) { var dfc = default_cmp, // closer in scope     cmp = default_cmp; if (primer) {     cmp = function(a, b) {         return dfc(primer(a), primer(b));     }; } if (reverse) {     return function(a, b) {         return -1 * cmp(a, b);     }; } return cmp;        };    // actual implementation    sort_by = function() {        var fields = [], n_fields = arguments.length, field, name, reverse, cmp;        // preprocess sorting options        for (var i = 0; i < n_fields; i++) { field = arguments[i]; if (typeof field === 'string') {     name = field;     cmp = default_cmp; } else {     name = field.name;     cmp = getCmpFunc(field.primer, field.reverse); } fields.push({     name: name,     cmp: cmp });        }        // final comparison function        return function(A, B) { var a, b, name, result; for (var i = 0; i < n_fields; i++) {     result = 0;     field = fields[i];     name = field.name;     result = field.cmp(A[name], B[name]);     if (result !== 0) break; } return result;        }    }}());

用法示例:

homes.sort(sort_by('city', {name:'price', primer: parseInt, reverse: true}));

原始功能:

var sort_by = function() {   var fields = [].slice.call(arguments),       n_fields = fields.length;   return function(A,B) {       var a, b, field, key, primer, reverse, result, i;       for(i = 0; i < n_fields; i++) {result = 0;field = fields[i];key = typeof field === 'string' ? field : field.name;a = A[key];b = B[key];if (typeof field.primer  !== 'undefined'){    a = field.primer(a);    b = field.primer(b);}reverse = (field.reverse) ? -1 : 1;if (a<b) result = reverse * -1;if (a>b) result = reverse * 1;if(result !== 0) break;       }       return result;   }};


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/390627.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号