Javascript 如何将自定义排序应用于数组?

Javascript 如何将自定义排序应用于数组?,javascript,underscore.js,Javascript,Underscore.js,我想以定制的方式对数组进行排序 例如,学生的班级级别: _.sortBy(["Junior","Senior","Freshman","Sophomore"], function(classlevel){ // ?? }) 理想情况下,排序应返回: ["Freshman","Sophomore","Junior","Senior&

我想以定制的方式对数组进行排序

例如,学生的班级级别:

_.sortBy(["Junior","Senior","Freshman","Sophomore"], function(classlevel){  
    // ??  
})
理想情况下,排序应返回:

["Freshman","Sophomore","Junior","Senior"]
我在想,如果我能像这样提前对班级级别进行排名:

var classlevelRanked = [{ class: "Junior",
   rank: 3
 },{ class: "Senior",
   rank: 4
 },{ class: "Freshman",
   rank: 1
 },{ class: "Sophomore",
   rank: 2
 }]
_.sortBy(["Junior","Senior","Freshman","Sophomore"], function(element){  
    var rank = {
        "Junior" : 3,
        "Senior" : 4,
        "Freshman" :1,
        "Sophomore" :2
    };

    return rank[element];
});
然后通过以下方式应用排序:

_.sortBy(classlevelRanked, function(classlevel){  
  return classlevel.rank;  
})
但接下来我必须通过以下方式去除等级:

.map(function(classlevel){  
    return classlevel["class"];  
})
有没有一种更直接的方法可以做到这一点,而不必预先对类级别进行排序,然后再将其剥离出来


谢谢。

您应该能够执行以下操作:

var classlevelRanked = [{ class: "Junior",
   rank: 3
 },{ class: "Senior",
   rank: 4
 },{ class: "Freshman",
   rank: 1
 },{ class: "Sophomore",
   rank: 2
 }]
_.sortBy(["Junior","Senior","Freshman","Sophomore"], function(element){  
    var rank = {
        "Junior" : 3,
        "Senior" : 4,
        "Freshman" :1,
        "Sophomore" :2
    };

    return rank[element];
});
小提琴:


或者,如果
rank
是一个在其他地方可能有用的常量,则可以在
表达式之外定义它,并用于更具声明性的样式:

var秩={
“初级”:3,
“高级”:4,
“新生”:1,
“二年级”:2
};
_.sortBy([“大三”、“大四”、“大一”、“大二”],u.财产(等级));

用超级黑客/糟糕的方式来做!!!!非常简单/令人困惑:)

编辑:

既然人们似乎觉得这个答案很有用,下面就解释一下它是如何工作的。。。它根据提供的单词中的一个字母进行排序。因为“大二”和“大四”有一个重复的第一个字母,我选择按第二个字母排序,每个单词都有一个唯一的值


然后按如下顺序排列:大四、大二、大一、大三。为了正确地对它们进行排序,我使用了Q(113)的字符代码进行了减法,该字符代码正好位于R(新生)的旁边。这意味着每个单词的第二个字母与Q的距离决定了顺序。为了防止出现负数,该函数获取结果的绝对值,并返回该值。

除了Jason的答案之外:

var list = _.sortBy([{name:"Junior"},{name:"Senior"},{name:"Freshman"},{name:"Sophomore"}], function(element){  
    var rank = {
        "Junior" : 3,
        "Senior" : 4,
        "Freshman" :1,
        "Sophomore" :2
    };

    return rank[element.name];
});

 console.dir(list);

7年后,它将有助于对对象数组进行排序,但这样做更干净

const order = ["Freshman", "Sophomore", "Junior", "Senior"];
_.sortBy(data, (o) => order.indexOf(o));

正是我要找的。谢谢JS 101:把你的排名放在回调语句之外,没有必要每次都重新定义
rank
。@mpowered,我认为这可能是过早的优化。浏览器应该能够将其识别为常量并编译一次。您还可以编写两个函数:一个声明rank并返回第二个执行排序的函数。将
rank
移动到函数范围之外会污染全局范围,因为它只适用于该函数,所以最好将它放在那里。@Jason如果不将它放在全局范围内,它不会污染全局范围。像这样的代码几乎永远不会在全局范围内结束,而依靠VM优化来修复一开始就应该正确完成的事情是一个愚蠢的想法。此外,在这种情况下,您将在其他地方使用它的可能性很高,例如,过滤器选择。最好将
rank
移动到循环之外,无需每次重新定义它。太棒了!完美地工作