自定义排序函数如何用于多维数组

时间:2012-01-22 10:53:16

标签: javascript arrays json multidimensional-array sorting

我已经梳理了网络,试图让自己了解以下内容与下面的对象相关的内容。 “a”和“b”是什么意思?为什么它很重要?

students.sort(function(a, b){
    return a.fn-b.ln
})

var students = [{
    fn : "Stone",
    ln : "Carpenter",
    scores : [61,99,73,68,80,62,176,78]
},
{
    fn : "Samson",
    ln : "Sears",
    scores : [68,193,91,190,95,65,171,75]
},
{
    fn : "Quin",
    ln : "Morton",
    scores : [79,95,161,92,182,163,198,182]
},
{
    fn : "Qunitessa",
    ln : "Hardy",
    scores : [99,65,75,69,77,67,86,78]
},
{
    fn : "Ashley",
    ln : "England",
    scores : [147,70,81,64,148,71,70,63]
},
{
    fn : "Thaddeus",
    ln : "Hutchinson",
    scores : [99,190,188,185,160,88,89,76]
},
{
    fn : "Yeo",
    ln : "Hayes",
    scores : [88,64,199,165,198,76,74,81]
},
{
    fn : "Rylee",
    ln : "Larson",
    scores : [71,126,63,71,168,173,175,88]
}
];

我理解匿名函数将返回-1,0,1的值,但参数ab的意义是什么,因为我不会传递任何值(例如当我调用函数时,为employees.sort(a.something, b.something))。有了上面的数据,我需要通过点击我的表的一个标题进行排序 - 这将涉及排序字符串和数字值。关于如何对“得分”数组中的嵌套值进行排序的任何想法?我如何通过姓/名进行排序?

2 个答案:

答案 0 :(得分:0)

数组的sort方法将采用您的排序功能,并在必要时应用它来比较两个元素并确定它们的排序顺序。 ab将是您要排序的数组的两个元素。

要按姓氏的字母顺序对对象进行排序,您需要一个像这样的排序功能:

function lastNameCompare(a, b) {
    var sortFieldA = a.ln.toLowerCase();
    var sortFieldB = b.ln.toLowerCase();
    return sortFieldA == sortFieldB ? 0 : (sortFieldA < sortFieldB ? -1 : 1);
}

如果您希望排序区分大小写,请删除.toLowerCase()。要对“姓氏,名字”进行排序,您可以使用以下行:

    var sortFieldA = (a.ln + ", " + a.fn).toLowerCase();
    var sortFieldB = (b.ln + ", " + b.fn).toLowerCase();

要对数据中的分数进行排序,您需要对数据集的每个条目执行排序:

for (var i = 0; i < students.length; i++) {
    var student = students[i];
    student.scores.sort();
}

请注意,在这种情况下您不需要显式排序功能,因为默认情况下sort将使用数字排序顺序。

答案 1 :(得分:0)

.sort接受回调。然后它将从数组中选取两个元素并将它们传递给回调函数。回调函数返回哪个元素更大。 .sort根据该信息重新排列数组中的两个元素。然后它需要两个其他元素并将它们传递给回调。冲洗,重复直至阵列分类。

ab只是“一个元素”和“另一个元素”的变量。不管你喜欢什么,都可以打命名没有意义。