Javascript — Сортировка объекта по нескольким значениям

#javascript #sorting

Вопрос:

 var data = {
  "input": [{
      "countA": 1,
      "countB": 10
    },
    {
      "countA": 15,
      "countB": 13
    },
    {
      "countA": 26,
      "countB": 24
    },
    {
      "countA": 6,
      "countB": 25
    },
    {
      "countA": 15,
      "countB": 20
    }
  ]
};

var sorted = data.input.sort(function(a, b) {
  return a['countB'] < b['countB'] ? 1 : -1;
});

console.log(sorted); 

Результат после первой сортировки должен быть после другой сортировки:

 [
    {
        "countA": 6,
        "countB": 25
    },
    {
        "countA": 15,
        "countB": 20
    },
    {
        "countA": 1,
        "countB": 10
    }
    {
        "countA": 26,
        "countB": 24
    },
    {
        "countA": 15,
        "countB": 13
    }
]
 

Таким образом, он должен быть самым высоким из «countB», а затем опускаться до тех пор, пока «countB» выше «countA». До сих пор я пробовал несколько способов, но пока результата нет.

Спасибо за любую помощь!

Комментарии:

1. За вашим выводом нет очевидной логики

2. «… до тех пор, пока «countB» выше, чем «countA».» что "countA" и "countB" ? a «с» или b «с»? И потом, каким должно быть сравнение?

3. Рассказав нам о своем примере использования или описании упражнения, вы поможете нам понять, чего вы пытаетесь достичь

4. Целое число «countB» всегда должно быть больше, чем целое число «countA», вот идея, лежащая в основе моего поста. Таким образом, всякий раз, когда «countA» выше, чем «countB», «countA» не должно иметь отношения к сортировке.

5. @Cid: В этом-то и вопрос… Вот почему я думаю, что другая сортировка после первой сортировки, как показано на рисунке «вернет[‘countB’] 1 : -1;» необходимо. Но я не могу найти для этого решения.

Ответ №1:

Вы можете сортировать по результату сравнения countB > countA , а затем по значению countB .

 const
    data = [{ countA: 1, countB: 10 }, { countA: 15, countB: 13 }, { countA: 26, countB: 24 }, { countA: 6, countB: 25 }, { countA: 15, countB: 20 }];

data.sort((a, b) =>
    (b.countB > b.countA) - (a.countB > a.countA) ||
    b.countB - a.countB
);

console.log(data); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

Комментарии:

1. Спасибо @Nina Scholz, это ответ, который больше всего помог мне понять сортировку!

Ответ №2:

Сначала вы можете извлечь значения массива when "countb" >= "countA" , отсортировать этот массив, а затем добавить оставшиеся значения в конце (обратите внимание, что порядок сохраняется для when "countb" < "countA" ). :

 var data = {
  "input": [{
      "countA": 1,
      "countB": 10
    },
    {
      "countA": 15,
      "countB": 13
    },
    {
      "countA": 26,
      "countB": 24
    },
    {
      "countA": 6,
      "countB": 25
    },
    {
      "countA": 15,
      "countB": 20
    }
  ]
};

const ElementsToSort = data.input.filter(elem => elem.countA <= elem.countB);
const RemainingElements = data.input.filter(elem => ElementsToSort.indexOf(elem) < 0);

// sort as you did
const PartiallySorted = ElementsToSort.sort(function(a, b) {
  return a['countB'] < b['countB']
          ? 1
          : a['countB'] > b['countB']
            ? -1
            : 0;
});


//add the remaining values
const sorted = PartiallySorted.concat(RemainingElements);
console.log(sorted);