Я пытаюсь отсортировать этот массив объектов по его логическим свойствам, но я пытаюсь найти решение с помощью метода сортировки javascripts

Я пытаюсь отсортировать его, поэтому верхний элемент в массиве будет «offer = true», затем «shortlisted = true» и, наконец, «rejected = true».

var toSort = [{
    offer: false,
    shortlisted: true,
    rejected: false,
    stage: 2
}, {
    offer: false,
    shortlisted: false,
    rejected: true,
    stage: null
}, {
    offer: true,
    shortlisted: true,
    rejected: false,
    stage: null
}, {
    offer: false,
    shortlisted: true,
    rejected: false,
    stage: 1
}];

Это конечный результат, которого я хотел бы достичь

[{
    offer: true,
    shortlisted: true,
    rejected: false,
    stage: null
}, {
    offer: false,
    shortlisted: true,
    rejected: false,
    stage: 1
}, {
    offer: false,
    shortlisted: true,
    rejected: false,
    stage: 2
}, {
    offer: false,
    shortlisted: false,
    rejected: true,
    stage: null
}]

Каков наилучший способ сортировки этого массива?

5
James Moran 12 Дек 2016 в 19:05

3 ответа

Лучший ответ

Вы можете использовать sort() вот так.

var toSort = [{
  offer: false,
  shortlisted: true,
  rejected: false,
  stage: 2
}, {
  offer: false,
  shortlisted: false,
  rejected: true,
  stage: null
}, {
  offer: true,
  shortlisted: true,
  rejected: false,
  stage: null
}, {
  offer: false,
  shortlisted: true,
  rejected: false,
  stage: 1
}];

var result = toSort.sort(function(a, b) {
  return b.offer - a.offer ||
    b.shortlisted - a.shortlisted ||
    b.rejected - a.rejected
})

console.log(result)
11
Nenad Vracar 12 Дек 2016 в 16:23

Простой способ:

toSort.sort(function(a, b){
    var numberA = a.offer * 5 + a.shortlisted * 3 + a.rejected;
    var numberB = b.offer * 5 + b.shortlisted * 3 + b.rejected;
    return numberA < numberB
});

Почему это работает:

1) мы можем рассматривать логическое значение как 0 или 1, поэтому, если a.offer верно, мы добавляем 5 к числу A, если не 0

2) Если свойство предложения истинно, даже если все остальные истинны, предложение все равно появится первым (потому что 5> 1 + 3 = 4)

Для более чем 3-х свойств: таким образом, мы даем приоритет булевым свойствам, которые вы хотите сначала, давая ему числовое значение, которое больше, чем сумма всех свойств с меньшим приоритетом

0
juvian 12 Дек 2016 в 16:25

Одним из способов является присвоение числовой оценки каждому объекту, установка более высокой оценки для значений более высокого приоритета. Например:

    var scoreObj = function(o) {
        var score = 0;
        if(o.offer) {
            score+=100;
        }
        if(o.shortlisted) {
            score+=10;
        }
        if(o.rejected) {
            score+=1;
        }
        return score;
    };
    var sorted = toSort.sort(function(a,b){
        return scoreObj(b) - scoreObj(a);
    });
0
Steve 12 Дек 2016 в 16:24