是否可以使用JavaScript基于数组中的键快速排序对象?

时间:2015-04-30 10:11:50

标签: javascript arrays quicksort

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

当我试图这样做时,它一直告诉我变量(在这种情况下,学生)是未定义的。

当我使用内置排序功能时,它完美运行。但是,这是一项学校作业,我必须显示快速排序功能的细分。

以下是我正在使用的代码:

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

1 个答案:

答案 0 :(得分:1)

在另一个函数中,不能使用函数内定义的变量。每个函数都有自己的作用域,为了在函数之间传递数据(在变量内部),你必须在upper(全局)作用域中创建一个变量。这意味着,你必须在函数之外创建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未定义的错误。你的studentsArray在哪里?如果你有它,那么它现在应该全部工作。

编辑:

在您创建第二个问题后,我很快就有机会查看修改后的代码。别忘了在这里更新你的问题。

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