2017-07-31 39 views
0

我有一个用户数组,他们的信息根据他们的角色被添加或列在列表中。以字母顺序前置对象| JavaScript

if (user.role === 'Student') { 
    rosterElement.appendChild(studentList); 
} else { 
    $(rosterElement).prepend(studentList); 
} 

如上所示,如果用户的角色是学生,他们会按姓氏的字母顺序附加到列表中。如果他们不是学生,那么他们是一位教师,他们被列入名单。但是,它们按照姓氏的顺序反向排列,如下所示。

STUDENT    ROLE 
    Jerome Terrell   Instructor 
    Priyanka Maheshwaran Instructor 
    Thomas Lee    Instructor 
    Angela Lee    Instructor 
    Eric Firestone   Student 
    Marshall Lee   Student 
    Devansh Patel   Student 
    Chris Ryker   Student 

有没有办法按字母顺序预先安排一个对象数组。我尝试过使用.before(),并且成功地将教师按alpa顺序排在前面,但将它们放在 studentList div之前,从而导致格式问题。如果您有任何建议,请提供。感谢

EDIT

studentList是在javascript所表示的列表项目(LI)的一个实例,而rosterElement是列表(UL)的实例。 JavaScript代码经过用户列表,并追加或用户的数据前添加到列表

+4

什么是'studentList'? – Ryan

+0

可能是:$(rosterElement).append(studentList.filter(u => u.role ===“Student”),studentList.filter(u => u.role ===“Instructor”)) –

+0

您可以显示你如何创建'studentList'? – Ryan

回答

0

只需要使用两个div中,然后追加教官第一,和学生第二:

$(rosterElement).html("<div></div><div></div>"); 

userList.forEach(function(user){ 

    $(rosterElement).children().eq(
    user.role === 'Student'?1:0 
    ).append(JSON.stringify(user)) 

}); 
0

你如果您在创建元素之前对studentList进行排序,则可能会更好(代码简洁性和性能)。

由于(在写作的时候)没有的studentList内容的例子,我会假设以下结构

var userList = [ { name: 'John Doe', role: 'Student' }, ... ]

在这种情况下,我排序的userList这样的:

userList.sort(function(a, b) { 
    // if the roles match, sort by name 
    if (a.role === b.role) { 
    // return -1 (a before b), 0 (do not change current order) 
    // or 1 (a after b) 
    return a.name < b.name ? -1 : Number(a.name > b.name); 
    } 

    // non-student roles go before student roles 
    return a.role !== 'Student' ? -1 : 1; 
}); 

如果您需要保留userList的初始订单,您需要知道sort将修改该订单,因此您需要创建副本(如果列表非常大,认为这是一个性能命中),然后将其排序并用于渲染;

var orderedUserList = userList.slice().sort(...)