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

编程入门 行业动态 更新时间:2024-10-22 08:31:58
本文介绍了如何排序多个字段对象的数组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

从这个原来的问题,我将如何应用排序对多个字段?

From this original question, how would I apply a sort on multiple fields?

使用这个稍微适应的结构,我将如何排序城市(升序)及那么价格(降序)?

Using this slightly adapted structure, how would I sort city (ascending) & then price (descending)?

var homes = [ {"h_id":"3", "city":"Dallas", "state":"TX", "zip":"75201", "price":"162500"}, {"h_id":"4", "city":"Bevery Hills", "state":"CA", "zip":"90210", "price":"319250"}, {"h_id":"6", "city":"Dallas", "state":"TX", "zip":"75000", "price":"556699"}, {"h_id":"5", "city":"New York", "state":"NY", "zip":"00010", "price":"962500"} ];

我喜欢的其实不是一个回答给予它提供了一个通用的方法。我在哪里打算使用此code,我将不得不排序日期以及其他的东西。有能力的黄金的对象似乎得心应手,如果没有一点累赘。

I liked the fact than an answer was given which provided a general approach. Where I plan to use this code, I will have to sort dates as well as other things. The ability to "prime" the object seemed handy, if not a little cumbersome.

我试图建立这个answer进入一个很好的通用示例,但我没有多少运气。

I've tried to build this answer into a nice generic example, but I'm not having much luck.

推荐答案

一个多维的排序方法,的在此基础上回答:

A multi dimensional sorting method, based on this answer:

更新:这是一个优化的版本。它可以做更多的preprocessing,并为每一个事先排序选项进行比较的功能。它可能需要更多的内存(因为它存储每个排序选项的功能,但它应该preform好一点,因为它不具备比较期间,以确定正确的设置。我没有做任何分析,虽然

Update: Here is an "optimized" version. It does a lot more preprocessing and creates a comparison function for each sorting option beforehand. It might need more more memory (as it stores a function for each sorting option, but it should preform a bit better as it does not have to determine the correct settings during the comparison. I have not done any profiling though.

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}));

DEMO

原有的功能:

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; } };

DEMO

更多推荐

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

本文发布于:2023-11-22 19:29:19,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1618718.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:多个   数组   字段   对象

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!