是否可以使用 JavaScript 根据数组中的键对对象进行快速排序?

Is it possible to quicksort objects based on their keys in an array, using JavaScript?

为了澄清一下这个问题,我有一个数组,数组中有一堆对象。我可以根据每个对象的键值重新排列数组中的对象吗?

当我尝试这样做时,它一直告诉我变量(在本例中为学生)未定义。

当我使用内置排序功能时,它工作得很好。然而,这是一项学校作业,我必须展示快速排序函数的分解。

这是我使用的代码:

        function swap(student, firstIndex, secondIndex){
            var temp = student[firstIndex];
            student[firstIndex] = student[secondIndex];
            student[secondIndex] = temp;
        }

        function partition(student, left, right) {

            var pivot   = student[Math.floor((right + left) / 2)],
                i       = left,
                j       = right;


            while (i <= j) {

                while (student[i] < pivot) {
                    i++;
                }

                while (student[j] > pivot) {
                    j--;
                }

                if (i <= j) {
                    swap(student, i, j);
                    i++;
                    j--;
                }
            }

            return i;
        }

        function quickSort(student, left, right) {

            var index;

            if (student.length > 1) {

                left = typeof left != "number" ? 0 : left;
                right = typeof right != "number" ? student.length - 1 : right;

                index = partition(student, left, right);
                if (left < index - 1) {
                    quickSort(student, left, index - 1);
                }

                if (index < right) {
                    quickSort(student, index, right);
                }

            }

            return student;
        }

    var studentNumbersArray = []

    var randomArray = [];

    for (i = 0; i < studentsArray.length; i++) { 
        studentNumbersArray.push(studentsArray[i].studentNumber);              
    }


    function sortStudentNumbers() {    
        var student = studentNumbersArray.name; // <-- THIS IS WHERE I AM GETTING ERROR
        quickSort(student);
        var updatedStudentArray = JSON.stringify(studentsArray);
        localStorage.setItem("students", updatedStudentArray); 
        location.reload();
    }

您不能在另一个函数中使用一个函数内部定义的变量。每个函数都有自己的作用域,为了在函数之间(变量内部)传输数据,您必须在上层(全局)作用域中创建一个变量。这意味着,您必须在函数之外创建 student 和 updatedStudentArray 并在不声明函数的情况下使用它们(sortStudentNumbers() 在这种情况下)

var student;
var updatedStudentArray;

function swap(student, firstIndex, secondIndex){
    var temp = student[firstIndex];
    student[firstIndex] = student[secondIndex];
    student[secondIndex] = temp;
}

// ..................................
// ------ removed for clearity
// ..................................

function sortStudentNumbers() {    
    student = studentNumbersArray.name; // <-- THIS IS WHERE I AM GETTING ERROR
    quickSort(student);
    updatedStudentArray = JSON.stringify(studentsArray);
    localStorage.setItem("students", updatedStudentArray); 
    location.reload();
}

这些是我发现的错误。但是,当我执行此代码时,我在控制台上收到 studentsArray is not defined 错误。你的 studentsArray 在哪里?如果你在某个地方有它,那么它现在应该都可以工作了。

编辑:

在您创建第二个问题后,我有机会快速查看了您修改后的代码。不要忘记在这里更新您的问题。

我对您修改后的代码的回答: 您必须先在 localStorage 中设置一个 "student" 键,以便为它使用 getItem() 。您在 localStorage 中没有任何内容,这就是为什么当您尝试从那里获取数据时未填充变量的原因。因此,您收到错误“Cannot read property 'studentNumber' of null”。

在看到你的代码的几个排列后,我认为你正在尝试做的事情需要看起来像这样。

quickSort(arrayToSort, attributeToSortOn, left, right) {
    ...
}
...
function partition(arrayToSort, attributeToSortOn, left, right) {
    var pivot = student[Math.floor((right + left) / 2)][attributeToSortOn]
    ...
    while (arrayToSort[i][attributeToSortOn] < pivot) {
    ...
}
...
quickSort(studentsArray, 'studentNumber');

quickSort 总是需要数组来比较每个位置的值。您不能只传递 studentsArray.studentNumber,因为要排序的属性本身是无用的,而且数组无论如何都不知道其中包含的对象类型。