繁体   English   中英

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

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

我有一个包含fYearFQtr键的对象数组。 我的目标是按FQtr键和fYear排序。 你能帮忙吗?

原始数据

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"}
]

预期的排序数据


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"}
]

我的方法

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);

将所有内容放在.sort回调中。 当您正确比较FQtr时,您还需要考虑相同 function 中的fYear值。

localeCompare将使这变得简单 - 按字典顺序,FY22 Q3 之后是 FY22 Q4,然后是 QTD。 按该差异排序 - 如果没有差异,则按 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