Использование функции для сортировки объектов JavaScript по значениям - PullRequest
0 голосов
/ 12 сентября 2018

Так что, если у меня есть массив объектов, таких как:

var a = [
  {
    name: "Apple",
    rank: 25
  },
  {
    name: "Cherry",
    rank: 29
  },
  {
    name: "Grape",
    rank: 15
  }
]

Есть ли способ сортировки значений, скажем, по рангу, вызывая функцию, я пытался это сделать, но продолжаю получатьundefined:

function sorting(obj){
    obj.sort(function(a, b){
        return a[1] - b[1];
    })
}

Я изо всех сил пытаюсь выяснить, где я иду не так, и не могу найти какие-либо документы по MDN по этому поводу.

Любая помощь будет принята с благодарностью, спасибо взаранее

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Одним из способов решения этой проблемы является использование алгоритма быстрой сортировки.Ниже я реализовал алгоритм, который будет выводить на консоль ваш массив перед сортировкой и массив после сортировки.

 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);
0 голосов
/ 12 сентября 2018

И 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...