[英]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.我有一个包含
fYear
和FQtr
键的对象数组。 My goal is to sort by FQtr
keys and fYear
.我的目标是按
FQtr
键和fYear
排序。 Would you please help?你能帮忙吗?
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);
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.