因此,如果我有一个对象数组,例如:
var a = [
{
name: "Apple",
rank: 25
},
{
name: "Cherry",
rank: 29
},
{
name: "Grape",
rank: 15
}
]
有没有一种方法可以通过调用函数来按等级对值进行排序,我曾尝试过但一直未定义:
function sorting(obj){
obj.sort(function(a, b){
return a[1] - b[1];
})
}
我正在努力找出问题所在,并且无法在MDN上找到与此相关的任何文件。
任何帮助将不胜感激,在此先感谢
答案 0 :(得分:8)
传递给a
的回调的b
和sort
都是数组中的对象。如果要访问其rank
属性,则需要执行a.rank
而不是a[1]
。 a[1]
和b[1]
均为undefined
,因为对象没有名为"1"
的属性:
return a.rank - b.rank;
示例:
var arr = [{ name: "Apple", rank: 25 }, { name: "Cherry", rank: 29 }, { name: "Grape", rank: 15 }];
arr.sort(function(a, b) {
return a.rank - b.rank;
});
console.log(arr);
注意:要颠倒排序顺序,请执行以下操作:
return b.rank - a.rank;
答案 1 :(得分:0)
解决此问题的一种方法是使用快速排序算法。下面,我实现了该算法,该算法将在排序之前将数组打印到控制台,在排序之后将数组打印到控制台。
var a = [
{
name: "Apple",
rank: 25
},
{
name: "Cherry",
rank: 29
},
{
name: "Grape",
rank: 15
}
];
console.log(a);
function swap(firstIndex, secondIndex){
var temp = a[firstIndex];
a[firstIndex] = a[secondIndex];
a[secondIndex] = temp;
}
function partition(left, right) {
var pivot = a[Math.floor((right + left) / 2)].rank,
i = left,
j = right;
while (i <= j) {
while (parseInt(a[i].rank) < pivot) {
i++;
}
while (parseInt(a[j].rank) > pivot) {
j--;
}
if (i <= j) {
swap(i, j);
i++;
j--;
}
}
return i;
}
function quickSort(left, right) {
var index;
if (a.length > 1) {
left = typeof left != "number" ? 0 : left;
right = typeof right != "number" ? a.length - 1 : right;
index = partition(left, right);
if (left < index - 1) {
quickSort(left, index - 1);
}
if (index < right) {
quickSort(index, right);
}
}
}
quickSort(a);
console.log(a);