#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);