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

时间:2013-05-30 21:46:05

标签: underscore.js

我想以自定义方式对数组进行排序。示例将是学生的班级级别:

_.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 个答案:

答案 0 :(得分:43)

你应该可以这样做:

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

    return rank[element];
});

小提琴:

http://jsfiddle.net/hKQj8/

答案 1 :(得分:8)

除了杰森的回答:

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

它将有助于排序对象数组

答案 2 :(得分:4)

这是超级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

修改

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

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

答案 3 :(得分:1)

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

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