繁体   English   中英

按两个属性和给定顺序对对象的JavaScript数组进行排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM