如何排序多个字段对象的数组? [英] How to sort an array of objects by multiple fields?
问题描述
从这个原来的问题,我将如何应用排序对多个字段?
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.
我试图建立这个<一个href=\"http://stackoverflow.com/questions/3230028/how-to-order-a-json-object-by-two-keys/3230748#3230748\">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}));
原有的功能:
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;
}
};
这篇关于如何排序多个字段对象的数组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!