Javascript--使用指定的对象属性顺序对对象数组进行排序

时间:2017-08-30 06:31:37

标签: javascript arrays sorting javascript-objects

最近我正在建立一个小型的网络应用程序,我有一系列对象,如

[
    {
        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" ...]

谢谢!

2 个答案:

答案 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; }