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
移动到循环之外,无需每次重新定义它。太棒了!完美地工作