[英]Sort JavaScript array of Objects by two properties and given order
我有这个对象的JavaScript数组:
data = [
{'deviation': 57.41, 'provider': "This", 'measure': "median"},
{'deviation': 49.02, 'provider': "All", 'measure': "median"},
{'deviation': 199.67, 'provider': "This", 'measure': "third_quartile"},
{'deviation': 152.31, 'provider': "All", 'measure': "third_quartile"},
{'deviation': 41.48, 'provider': "This", 'measure': "first_quartile"},
{'deviation': -1.07, 'provider': "All", 'measure': "first_quartile"}
]
并且我想按“ provider”(在三个“ All”之前的三个“ This”)和“ measure”(第一个四分位数,中位数,第三个四分位数)对它进行排序,因此结果数组如下所示:
data = [
{'deviation': 41.48, 'provider': "This", 'measure': "first_quartile"},
{'deviation': 57.41, 'provider': "This", 'measure': "median"},
{'deviation': 199.67, 'provider': "This", 'measure': "third_quartile"},
{'deviation': -1.07, 'provider': "All", 'measure': "first_quartile"}
{'deviation': 49.02, 'provider': "All", 'measure': "median"},
{'deviation': 152.31, 'provider': "All", 'measure': "third_quartile"},
]
我已经写的函数作为参数传递给.sort()
并且它返回数组的排序条件为“提供商”,但然后当我给它到相同的功能与measure
作为自变量(幸运的是,FIRST_QUARTILE,中位数,THIRD_QUARTILE是已经按照我想要的方式按字母顺序排序)-排序被打乱了。 我该怎么做呢?
编辑我一直在使用的功能:
var compare_prv = function(a,b) {
if (a.provider < b.provider){
return 1;
}
return 0;
}
var compare_meas = function(a,b) {
if (a.measure < b.measure){
return -1;
}
return 0;
}
听起来您在做:
data.sort(function(a, b) {
//sort by provider
});
data.sort(function(a, b) {
//sort by measure
});
但是您想要做的是:
data.sort(function(a, b) {
//sort by provider, but if they are equal, sort by measure
});
所以像
data.sort(function(a, b) {
if (a.provider === b.provider) {
return a.measure.localeCompare(b.measure);
}
return b.provider.localeCompare(a.provider);
});
您可以将排序条件与逻辑OR ||
在一起 。
对于具有定义顺序的一组字符串,可以使用一个对象来获取所需的顺序。
{ first_quartile: 1, median: 2, third_quartile: 3 }
这使您可以对某些项目进行排序(如果不在排序列表中),则可以从默认的零开始或以一个非常大的值(如
Infinity
从底部开始。在这种情况下,模式看起来像
(order[a.measure] || 0) - (order[a.measure] || 0) // to top (order[a.measure] || Infinify ) - (order[a.measure] || Infinity) // to bottom
var array = [{ deviation: 57.41, provider: "This", measure: "median" }, { deviation: 49.02, provider: "All", measure: "median" }, { deviation: 199.67, provider: "This", measure: "third_quartile" }, { deviation: 152.31, provider: "All", measure: "third_quartile" }, { deviation: 41.48, provider: "This", measure: "first_quartile" }, { deviation: -1.07, provider: "All", measure: "first_quartile" }], order = { first_quartile: 1, median: 2, third_quartile: 3 }; array.sort(function (a, b) { return b.provider.localeCompare(a.provider) || order[a.measure] - order[b.measure]; }); console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.