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

是否可以使用JavaScript根据数组中的键对对象进行快速排序?,javascript,arrays,quicksort,Javascript,Arrays,Quicksort,为了澄清这个问题,我有一个数组,数组中有一堆对象。我可以根据每个对象的键值重新排列数组中的对象吗 当我尝试这样做时,它总是告诉我变量(在本例中为students)未定义 当我使用内置的排序功能时,它工作得非常好。然而,这是一项学校作业,我必须展示快速排序功能的分解 以下是我正在使用的代码: function swap(student, firstIndex, secondIndex){ var temp = student[firstIndex];

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

当我尝试这样做时,它总是告诉我变量(在本例中为students)未定义

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

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

        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();
    }
函数交换(学生、第一索引、第二索引){
var temp=学生[firstIndex];
学生[第一索引]=学生[第二索引];
学生[secondIndex]=临时工;
}
功能分区(学生、左、右){
var pivot=学生[数学楼层((右+左)/2)],
i=左,
j=右;
而(我){
j--;
}
如果(i)1{
左=左的类型!=“编号”?0:左;
右=右的类型!=“数字”?student.length-1:右;
索引=分区(学生、左、右);
如果(左<索引-1){
快速排序(学生,左,索引-1);
}
如果(索引<右){
快速排序(学生,索引,右);
}
}
留学生;
}
var studentNumbersArray=[]
var randomArray=[];
对于(i=0;ivar student=studentNumbersArray.name;//您不能在一个函数中或在另一个函数中使用定义的变量。每个函数都有自己的作用域,为了在函数之间(变量内部)传输数据,您必须在上部(全局)中创建一个变量也就是说,您必须在函数之外创建student和updatedStudentArray,并在函数中使用它们,而无需声明(
sortStudentNumbers()

var学生;
var更新的studentarray;
函数交换(学生、第一索引、第二索引){
var temp=学生[firstIndex];
学生[第一索引]=学生[第二索引];
学生[secondIndex]=临时工;
}
// ..................................
//------为了清晰起见,请将其删除
// ..................................
函数sortStudentNumbers(){

student=studentNumbersArray.name;//在看到代码的几种排列之后,我认为您尝试执行的操作需要看起来像这样

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');
快速排序(arrayToSort、attributeToSortOn、左、右){
...
}
...
函数分区(arrayToSort、attributeToSortOn、左、右){
var pivot=学生[Math.floor((右+左)/2)][attributeToSortOn]
...
while(数组排序[i][attributeToSortOn]

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

在任何情况下都没有将students变量分配给任何值re.为什么在创建错误的行中出现
.name
?@ilter我在sortStudentNumbers函数下声明它,
var student=studentNumbersArray.name;
@ammq它表示该学生(studentNumbersArray.name)你能把这个问题编辑成形状吗?你似乎有一个介绍性的段落,然后是一个代码示例(很好),然后你又把它全部粘贴进去了。如果代码示例不一样,请删除你不想要的,和解释一样。我们希望问题保持外观(甚至得到改进)即使在答案被接受之后,也要让这里的其他读者受益。谢谢!谢谢你的洞察力!我实际上在复制到这个线程上的代码上犯了一个错误。当我访问我的笔记本电脑时,我会尝试你说的话,如果它不起作用,那么我将用正确的代码创建一个新线程。再次感谢!谢谢!可能你是一个LSO赞成这个答案,因为它有帮助:“完成了!我仍然有一些问题,所以你能考虑检查这个线程吗?”NAME12345 67,我更新了我的答案。不要忘记,你得到的错误是因为一个未填充的变量。你不能读取一个未定义的或空的对象的属性。谢谢,但是我在我的本地存储中有一个学生密钥。(检查我的更新代码,我包括了我的本地存储)。此外,没有值为null(它们要么有值,要么为0)。这是一个内置的排序函数,如果有用的话:
studentsArray.sort(函数(a,b){return parseFloat(a.studentNumber)-parseFloat(b.studentNumber)})
基本上这就是我最终要做的,我发现这个网站,代码运行得很好:谢谢你的回复!
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');