简体   繁体   English

如何按多个属性值对javascript的对象数组进行排序

[英]How to sort javascript's array of objects by multiple property value

I have an array of Objects that contains the fYear and FQtr keys.我有一个包含fYearFQtr键的对象数组。 My goal is to sort by FQtr keys and fYear .我的目标是按FQtr键和fYear排序。 Would you please help?你能帮忙吗?

Original Data原始数据

const data = [
    { "fYear": "FY22 Q3", "FQtr": "W10"},
    { "fYear": "FY22 Q3", "FQtr": "W11"},
    { "fYear": "FY22 Q3", "FQtr": "W12"},
    { "fYear": "FY22 Q3", "FQtr": "W13"},
    { "fYear": "FY22 Q3", "FQtr": "W2"},
    { "fYear": "FY22 Q4", "FQtr": "W1"},
    { "fYear": "FY22 Q3", "FQtr": "W3"},
    { "fYear": "FY22 Q3", "FQtr": "W4"},
    { "fYear": "FY22 Q4", "FQtr": "W2"},
    { "fYear": "FY22 Q3", "FQtr": "W5"},
    { "fYear": "FY22 Q3", "FQtr": "W6"},
    { "fYear": "FY22 Q3", "FQtr": "W7"},
    { "fYear": "FY22 Q3", "FQtr": "W8"},
    { "fYear": "FY22 Q3", "FQtr": "W9"},
    { "fYear": "FY22 Q4", "FQtr": "W4"},
    { "fYear": "QTD", "FQtr": "QTD"},
    { "fYear": "FY22 Q4", "FQtr": "W3"}
]

Expected Sorted Data预期的排序数据


const data = [
    { "fYear": "FY22 Q3", "FQtr": "W2"},
    { "fYear": "FY22 Q3", "FQtr": "W3"},
    { "fYear": "FY22 Q3", "FQtr": "W4"},
    { "fYear": "FY22 Q3", "FQtr": "W5"},
    { "fYear": "FY22 Q3", "FQtr": "W6"},
    { "fYear": "FY22 Q3", "FQtr": "W7"},
    { "fYear": "FY22 Q3", "FQtr": "W8"},
    { "fYear": "FY22 Q3", "FQtr": "W9"},
    { "fYear": "FY22 Q3", "FQtr": "W10"},
    { "fYear": "FY22 Q3", "FQtr": "W11"},
    { "fYear": "FY22 Q3", "FQtr": "W12"},
    { "fYear": "FY22 Q3", "FQtr": "W13"},
    { "fYear": "FY22 Q4", "FQtr": "W1"},
    { "fYear": "FY22 Q4", "FQtr": "W2"},
    { "fYear": "FY22 Q4", "FQtr": "W3"},
    { "fYear": "FY22 Q4", "FQtr": "W4"},
    { "fYear": "QTD", "FQtr": "QTD"}
]

My Approach我的方法

function sortFQtr( a, b ) {
    const [prevVal, nextVal] = [Number.parseInt(a.FQtr.substring(1)), Number.parseInt(b.FQtr.substring(1))];
  if ( prevVal < nextVal ) return -1;
  if ( prevVal > nextVal) return 1;
  return 0;
}

// ["FY22 Q4", "FY22 Q3", "QTD"]
 var fYears = data.map(value => value.fYear).filter( (value, index, _arr) => _arr.indexOf(value) == index);

Put everything inside the .sort callback.将所有内容放在.sort回调中。 While you're comparing the FQtr s properly, you also need to factor in the fYear values in the same function.当您正确比较FQtr时,您还需要考虑相同 function 中的fYear值。

localeCompare will make this easy - lexiographically, FY22 Q3 is followed by FY22 Q4, which is then followed by QTD. localeCompare将使这变得简单 - 按字典顺序,FY22 Q3 之后是 FY22 Q4,然后是 QTD。 Sort by that difference - and if there is no difference, then sort by the FQtr property, which can also be done with localeCompare (with the numeric option).按该差异排序 - 如果没有差异,则按 FQtr 属性排序,这也可以使用localeCompare (使用数字选项)来完成。

 const data = [ { "fYear": "FY22 Q3", "FQtr": "W10"}, { "fYear": "FY22 Q3", "FQtr": "W11"}, { "fYear": "FY22 Q3", "FQtr": "W12"}, { "fYear": "FY22 Q3", "FQtr": "W13"}, { "fYear": "FY22 Q3", "FQtr": "W2"}, { "fYear": "FY22 Q4", "FQtr": "W1"}, { "fYear": "FY22 Q3", "FQtr": "W3"}, { "fYear": "FY22 Q3", "FQtr": "W4"}, { "fYear": "FY22 Q4", "FQtr": "W2"}, { "fYear": "FY22 Q3", "FQtr": "W5"}, { "fYear": "FY22 Q3", "FQtr": "W6"}, { "fYear": "FY22 Q3", "FQtr": "W7"}, { "fYear": "FY22 Q3", "FQtr": "W8"}, { "fYear": "FY22 Q3", "FQtr": "W9"}, { "fYear": "FY22 Q4", "FQtr": "W4"}, { "fYear": "QTD", "FQtr": "QTD"}, { "fYear": "FY22 Q4", "FQtr": "W3"} ]; data.sort((a, b) => ( a.fYear.localeCompare(b.fYear) || a.FQtr.localeCompare(b.FQtr, 'en', { numeric: true }) )); console.log(data);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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