使用Javascript对包含对象的数组进行冒泡排序

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

我猜测我的语法有问题。希望能得到反馈。


可能是因为在do-while循环开始之前您没有初始化swapped变量。尝试将var swapped替换为var swapped = false - mfaerevaag
使用本地的 sort 会更快。https://dev59.com/UXNA5IYBdhLWcg3wAI3d#1129270 - b1_
2个回答

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

由于a [i] .para [i + 1] .par都返回 undefined ,因此您没有收到任何错误。 (因此a [i] .par> a [i + 1] .par 始终返回false)

这是经过修订的代码:

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是按值传递还是按引用传递的语言?


2
你能澄清一下你的第一个陈述(JavaScript没有函数参数的“按引用传递”)吗?a绝对是通过引用传递到bubbleSort中的,或者你想象它被复制了,然后复制品被传递到bubbleSort中?在bubbleSort内部原地对数组进行排序肯定会起作用。 - Alexander Pavlov
@AlexanderPavlov 我的一个糊涂/无知的时刻,你是完全正确的。我已经修改了我的答案。谢谢! :) - Shadow The Spring Wizard
不错的回答,除此之外没什么问题! - Alexander Pavlov

5

使用内置的数组排序函数:

arrayOfPeople.sort(function(a,b) {return a.age-b.age;});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接