4

初学者在这里!

最近偶然发现一个问题。基本上,程序需要按对象的一个​​字段对对象数组进行排序,而无需实际使用 sort 函数。我已经使用冒泡排序算法尝试了这段代码,但它似乎不起作用:

var arrayOfPeople = [
    {name: "Rick", age: 30, place: 2},
    {name: "Alan", age: 25, place: 1},
    {name: "Joe", age: 40, place: 4},
    {name: "Dave", age: 35, place: 3}
];


function bubbleSort(a,par)
{
    var swapped;

    do {
        swapped = false;

        for (var i = 0; i < a.length - 1; i++) {
            if (a[i].par > a[i + 1].par) {
                var temp = a[i];

                a[i] = a[i + 1];
                a[i + 1] = temp;

                swapped = true;
            }
        }
    } while (swapped);
}


bubbleSort(arrayOfPeople,'age');

for (i = 0; i < arrayOfPeople.length; i++) {
    console.log(arrayOfPeople[i]);
}

我的猜测是我在语法方面做错了。将不胜感激任何反馈。

4

2 回答 2

8

唯一的问题是您没有正确使用“par”参数。该obj.prop语法将始终尝试查找名为“prop”的属性,因此要使其动态化,您需要使用方括号,例如 obj[“prop”],它可以获取变量而不是“prop”。

您没有收到任何错误,因为a[i].par两者a[i+1].par都返回了undefined,可以与自身进行比较。(因此a[i].par > a[i+1].par总是返回假)

这是有效的修改代码:

function bubbleSort(a, par)
{
    var swapped;
    do {
        swapped = false;
        for (var i = 0; i < a.length - 1; i++) {
            if (a[i][par] > a[i + 1][par]) {
                var temp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = temp;
                swapped = true;
            }
        }
    } while (swapped);
}


bubbleSort(arrayOfPeople, 'age');

for (i = 0; i < arrayOfPeople.length; i++) {
   console.log(arrayOfPeople[i]);
}

现场测试用例

在这种情况下值得一提的是,改变实际对象(在这种情况下为数组)的函数并不是一件小事。要了解更多按值传递和按引用传递的信息,请查看这个出色的问题:JavaScript 是按引用传递还是按值传递语言?

于 2013-06-06T08:03:52.613 回答
4

使用内置的数组排序功能:

arrayOfPeople.sort(function(a,b) {return a.age-b.age;});
于 2014-01-18T21:59:17.377 回答