В таком случае, когда вы хотите сортировать по нескольким уровням, вам нужно отсортировать их в порядке убывания важности внутри вашей функции сортировки.
В этом случае мы регулярно сортируем в тех случаях, когда оба элемента находятся в или не в массиве сортировки.
var itemsArray = [
{ id: 8, name: 'o' },
{ id: 7, name: 'g' },
{ id: 6, name: 'a' },
{ id: 5, name: 'k' },
{ id: 4, name: 'c' }
];
var sortArray = [4, 5];
var sortedItemsArray = itemsArray.sort(function (a, b) {
if (sortArray.includes(a.id) == sortArray.includes(b.id)) { //both or neither are in sort array
return b.id - a.id;
}
else if (sortArray.includes(a.id)) { //only a in sort array
return -1;
}
else { //only b in sort array
return 1;
}
});
console.log(sortedItemsArray);
Приведенный выше фрагмент кода можно расширить несколькими способами, но популярный подход заключается в разделении его на несколько этапов сортировки.
var itemsArray = [
{ id: 8, name: 'o' },
{ id: 7, name: 'g' },
{ id: 6, name: 'a' },
{ id: 5, name: 'k' },
{ id: 4, name: 'c' }
];
var sortArray = [4, 5];
function sortId(a, b) {
return b.id - a.id;
}
function sortIdByList(a, b) {
if (sortArray.includes(a.id)) {
return -1;
}
if (sortArray.includes(b.id)) {
return 1;
}
return 0;
}
//TEST
var sortedItemsArray = itemsArray
.sort(sortId)
.sort(sortIdByList);
console.log(sortedItemsArray);
Эту схему проще поддерживать, поскольку каждый шаг четко обозначен, а функции можно повторно использовать в других случаях сортировки. [1114 ]
Единственный недостаток этого паттерна заключается в том, что в конечном итоге вы повторяете список несколько раз, увеличивая время сортировки. Обычно это не проблема, но в очень больших списках это может быть важно.
Сортировать только по индексу массива
Поскольку комментарии указывают, что я неправильно прочитал вопрос, поэтому мои предыдущие два фрагмента сортировки не обязательно дают желаемый результат.
Эта версия сортирует только по индексу в массиве сортировки:
var itemsArray = [
{ id: 8, name: 'o' },
{ id: 7, name: 'g' },
{ id: 6, name: 'a' },
{ id: 5, name: 'k' },
{ id: 4, name: 'c' }
];
var sortArray = [4, 5];
//TEST
var sortedItemsArray = itemsArray
.sort(function (a, b) {
//Calculate index value of a
var A = sortArray.indexOf(a.id);
if (A == -1) {
A = sortArray.length;
}
//Calculate index value of b
var B = sortArray.indexOf(b.id);
if (B == -1) {
B = sortArray.length;
}
//Return comparison
return A - B;
});
console.log(sortedItemsArray);
Martin Fowler написал интересную статью об этой теме: Архитектура GUI
Когда я кодирую GUI в GWT, мне нравится создавать Виджеты, которые делают просто некоторую небольшую задачу. Таким образом, становится намного более ясно, когда Вы затем комбинируете те виджеты в заключительном представлении. С другой стороны, можно получить путаницу виджета на всем протяжении. Так попытайтесь сбалансировать то, что может войти в новый виджет (чтобы использоваться на многих местах) и что в представлении.
Больше походит на очень общую проблему программирования затем просто связанный GUI. Почему Вы чувствуете, что это только происходит с Вашим кодом GUI? Состоит в том Ваша единственная проблема, что Ваши компоненты представления чувствуют себя нарушенными методами считывания/методами set и constsructors со многими параметрами?
Не очень можно сделать о конструкторах со многими параметрами кроме проверки, что все параметры на самом деле необходимы. Вы могли бы хотеть взглянуть на шаблон Разработчика btw. Это, вероятно, привычка сокращает количество параметров, но это - хорошая практика для ограничения использования нового ключевого слова.
Вероятно, не ответ Вы искали, но видите, можно ли быть более конкретны относительно проблемы и почему Вы чувствуете, что это только происходит в Вашем коде GUI.