使用函数按值对JavaScript对象进行排序

时间:2018-09-11 22:24:28

标签: javascript arrays function sorting

因此,如果我有一个对象数组,例如:

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上找到与此相关的任何文件。

任何帮助将不胜感激,在此先感谢

2 个答案:

答案 0 :(得分:8)

传递给a的回调的bsort都是数组中的对象。如果要访问其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);