基于多个值对数组进行排序

3
我将尝试根据多个值,即report_yr和report_qtr来对以下数组进行排序。该数组应首先按年份排序,然后按季度排序(对于同一年份)。
// 输入的数组
let arr = [{
  report_yr: '2008',
  report_qtr: '1'
},
{
  report_yr: '2019',
  report_qtr: '3'
},
{
  report_yr: '2019',
  report_qtr: '4'
},
{
  report_yr: '2017',
  report_qtr: '2'
},
{ report_yr: '2008',
  report_qtr: '2'
}];

// 预期输出:

[ 
{ report_yr: '2019',
report_qtr: '4' },
{ report_yr: '2019',
report_qtr: '3' },
{ report_yr: '2008',
report_qtr: '1'
},{ report_yr: '2008',
report_qtr: '2'
},
{ report_yr: '2017',
report_qtr: '2' } ];

// 我的尝试:

我正在尝试使用loadash方法进行操作,

_.sortBy(arr,
      ['report_yr', 'report_qtr']);

同样尝试了orderBy,但迄今为止没有成功。


1
为什么当report_yr2018时,你的结果随着report_qtr上升,但当report_yr2019时,对象降序? - Nick Parsons
5个回答

2
你可以使用 sort 方法并且仅使用简单的JavaScript来实现这个功能。

let arr = [{"report_yr":"2008","report_qtr":"1"},{"report_yr":"2019","report_qtr":"3"},{"report_yr":"2019","report_qtr":"4"},{"report_yr":"2017","report_qtr":"2"},{"report_yr":"2008","report_qtr":"2"}]

arr.sort((a, b) => b.report_yr - a.report_yr || b.report_qtr - a.report_qtr)
console.log(arr)


0

这可能适合你。

data.sort(function (x, y) {
    var n = y.report_qtr - x.report_qtr;
    if (n !== 0) {
        return n;
    }

    return y.report_yr- x.report_yr;
});

0

如果你将report_yrreport_qtr相加并按照降序排序,会发生什么呢?

    arr = arr.sort((a, b) => {
        const one = parseInt(a.report_yr) + parseInt(a.report_qtr);
        const two = parseInt(b.report_yr) + parseInt(b.report_qtr);
        if (one > two) {
            return -1
        }
        return 1;
    });

0
使用 sort 方法。

let arr = [{
  report_yr: '2008',
  report_qtr: '1'
},
{
  report_yr: '2019',
  report_qtr: '3'
},
{
  report_yr: '2019',
  report_qtr: '4'
},
{
  report_yr: '2017',
  report_qtr: '2'
},
{ report_yr: '2008',
  report_qtr: '2'
}]

arr.sort((b, a) => +a.report_yr - +b.report_yr || +a.report_qtr - +b.report_qtr )

console.log(arr)


0
使用_.orderBy代替_.sortBy。如果不这样做,您将无法进行降序排序。
这将按report_qtr降序和report_yr升序排序。我注意到您想要的输出与排序相矛盾...

let arr = [{
  report_yr: '2008',
  report_qtr: '1'
}, {
  report_yr: '2019',
  report_qtr: '3'
}, {
  report_yr: '2019',
  report_qtr: '4'
}, {
  report_yr: '2017',
  report_qtr: '2'
}, {
  report_yr: '2008',
  report_qtr: '2'
}];

let sortedArr = _.orderBy(arr, ['report_qtr', 'report_yr'], ['desc', 'asc']);

console.log(sortedArr);
.as-console-wrapper {
  top: 0;
  max-height: 100% !important;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>


如果你真的想要那个订单,你可以这样做:

  1. 查找年度频率
  2. 按频率排序
  3. 按年份排序
  4. 检查年份是否为奇数,按季度降序排序
  5. 检查年份是否为偶数,按季度升序排序
  6. 回退到按季度升序排序

let arr = [
  { report_yr: '2008', report_qtr: '1' },
  { report_yr: '2019', report_qtr: '3' },
  { report_yr: '2019', report_qtr: '4' },
  { report_yr: '2017', report_qtr: '2' },
  { report_yr: '2008', report_qtr: '2' }
];

const yearFreq = arr.reduce((o, i) => ({...o, [i.report_yr] : (o[i.report_yr] || 0) + 1}), {});

let sortedArray = arr.sort((a, b) => {
  let diff = yearFreq[b.report_yr] - yearFreq[a.report_yr];
  if (diff !== 0) return diff;
  let a_year = parseInt(a.report_yr, 10);
  let b_year = parseInt(b.report_yr, 10);
  diff = b_year - a_year;
  if (diff !== 0) return diff;
  let a_odd = a_year % 2 === 1;
  let b_odd = b_year % 2 === 1;
  let a_qtr = parseInt(a.report_qtr, 10);
  let b_qtr = parseInt(b.report_qtr, 10);
  if (a_odd && b_odd) return b_qtr - a_qtr;
  if (!a_odd && !b_odd) return a_qtr - b_qtr;
  return a_qtr - b_qtr;
});

console.log(sortedArray);
.as-console-wrapper { top: 0; max-height: 100% !important; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

<!-- Expected

[{
  "report_yr": "2019",
  "report_qtr": "4"
}, {
  "report_yr": "2019",
  "report_qtr": "3"
}, {
  "report_yr": "2008",
  "report_qtr": "1"
}, {
  "report_yr": "2008",
  "report_qtr": "2"
}, {
  "report_yr": "2017",
  "report_qtr": "2"
}]

-->


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接