最近我正在建立一个小型的网络应用程序,我有一系列对象,如
[
{
id: '3',
semester: 'summer freshman',
rating: '10'
},
{
id: '4',
semester: 'spring freshman',
rating: '9.5'
},
{
id: '5',
semester: 'fall freshman',
rating: '10'
}
]
,我如何按顺序对数据进行排序,以便首先输入semester == fall freshman
的条目,然后输入semester == spring freshman
,最后输入semester == summer freshman
。
换句话说,有没有办法根据每个对象中的semester属性的值对对象数组进行排序,使其遵循以下顺序:
["fall freshman", "spring freshman", "summer freshman", "fall sophomore" ...]
谢谢!
答案 0 :(得分:5)
您可以使用自定义排序方法。保持一系列学期的所需订单。然后根据学期数组对数组进行排序。
let arr = [
{id: '3', semester:'summer freshman', rating: '10'},
{id: '4', semester: 'spring freshman', rating: '9.5'},
{id:'5', semester:'fall freshman', rating: '10'}
]
const semesterList = ["fall freshman", "spring freshman", "summer freshman", "fall sophomore"]
arr.sort((a, b) => semesterList.indexOf(a.semester) - semesterList.indexOf(b.semester))
答案 1 :(得分:0)
您可以使用对象对顺序进行排序,并为未知值采用默认值。使用order.default
,您可以使用未知值并将零或小于零的值移至顶部或非常大的值,例如Infinity
将项目移至底部。
对于已知值,我建议使用一个与零不同的值,因为零或未知结果会产生默认值。
var data = [{ id: '3', semester: 'summer freshman', rating: '10' }, { id: '4', semester: 'spring freshman', rating: '9.5' }, { id:'5', semester: 'fall freshman', rating: '10' }, { id:'99', semester: 'foo freshman', rating: '0' }],
semesters = ["fall freshman", "spring freshman", "summer freshman", "fall sophomore"],
order = Object.create(null);
order.default = Infinity;
semesters.forEach((s, i) => order[s] = i + 1);
data.sort((a, b) => (order[a.semester] || order.default) - (order[b.semester] || order.default));
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }