是否可以使用 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
,因为要排序的属性本身是无用的,而且数组无论如何都不知道其中包含的对象类型。
为了澄清一下这个问题,我有一个数组,数组中有一堆对象。我可以根据每个对象的键值重新排列数组中的对象吗?
当我尝试这样做时,它一直告诉我变量(在本例中为学生)未定义。
当我使用内置排序功能时,它工作得很好。然而,这是一项学校作业,我必须展示快速排序函数的分解。
这是我使用的代码:
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
,因为要排序的属性本身是无用的,而且数组无论如何都不知道其中包含的对象类型。