15

我想以自定义方式对数组进行排序。

示例是学生的班级级别:

_.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(classlevelRanked, function(classlevel){  
  return classlevel.rank;  
})

但随后我必须通过以下方式去除队伍:

.map(function(classlevel){  
    return classlevel["class"];  
})

有没有更直接的方法可以做到这一点,而无需预先对班级级别进行排名,然后再将其剥离?

谢谢你。

4

4 回答 4

55

你应该能够做这样的事情:

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

    return rank[element];
});

小提琴:

http://jsfiddle.net/hKQj8/


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

var rank = {
    "Junior" : 3,
    "Senior" : 4,
    "Freshman" :1,
    "Sophomore" :2
};

_.sortBy(["Junior","Senior","Freshman","Sophomore"], _.propertyOf(rank));
于 2013-05-30T22:11:57.027 回答
12

除了杰森的回答:

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);

它将有助于对对象数组进行排序

于 2013-09-10T15:03:51.047 回答
3

用超级hackish/糟糕的方式来做!!!!死的简单/疯狂的混乱:)

function rank(word){
    return Math.abs(113-word.trim().toLowerCase().charCodeAt(1));
}

console.log(rank('freshman')); // 1
console.log(rank('sophomore')); // 2
console.log(rank('junior')); // 4
console.log(rank('senior')); // 12

编辑:

由于人们似乎发现这个答案很有用,这里解释了它是如何工作的......它根据所提供单词中的一个字母进行排序。由于“sophomore”和“senior”有重复的第一个字母,我选择按第二个字母排序,每个单词都有一个唯一的值。

然后会以这种方式对它们进行排序:sEnior、sOphomore、fReshman、jUnior。为了正确地对它们进行排序,我使用紧邻 R(对于新生)的 Q(113)的字符代码减去。这意味着每个单词的第二个字母与 Q 的接近程度决定了顺序。为了防止出现负数,该函数获取结果的绝对值,然后返回。

于 2013-05-30T22:52:37.237 回答
3

7年后,但这样做更干净。

const order = ["Freshman", "Sophomore", "Junior", "Senior"];
_.sortBy(data, (o) => order.indexOf(o));
于 2021-05-19T18:55:41.517 回答