#javascript
#javascript
Вопрос:
Как мы можем сортировать эти объекты сверху-> снизу, и в то же время Слева-> По центру-> Справа?
{value: "upperRight"}
{value: "upperLeft"}
{value: "bottomRight"}
{value: "bottomCenter"}
{value: "bottomLeft"}
Комментарии:
1. Что вы пробовали?
Ответ №1:
split
каждыйvalue
из/(?=[A-Z])/
них, чтобы получить их вертикальное и горизонтальное положение. Это создаст массив, подобный этому:["upper", "Right"]
- Деструктурируйте массив, чтобы преобразовать их в 2 отдельные переменные
- Создайте 2 приоритетных объекта. Один для отображения порядка вертикальных позиций, а другой для горизонтальных
- Сначала
sort
на основеvertical
приоритета. Если они оба имеют одинаковый приоритет,vertical[a1] - vertical[b1]
вернет 0. Итак,||
будем сортировать их на основеhorizontal
части
const array=[{value:"upperRight"},{value:"upperLeft"},{value:"bottomRight"},{value:"bottomCenter"},{value:"bottomLeft"}];
const vertical = {
"upper": 1,
"bottom": 2
}
const horizontal = {
"Left": 1,
"Center": 2,
"Right": 3
}
array.sort((a,b) => {
const [a1, a2] = a.value.split(/(?=[A-Z])/)
const [b1, b2] = b.value.split(/(?=[A-Z])/)
return vertical[a1] - vertical[b1] || horizontal[a2] - horizontal[b2]
})
console.log(array)
Если split
операция стоит дорого, вы можете добавить map
операцию, чтобы получить все разделенные значения заранее и отсортировать их.
Ответ №2:
Array.prototype.sort() позволяет указать функцию сравнения. Просто установите некоторые основные правила о том, как вы оцениваете строку. Например:
- «Верхний» стоит 10 баллов
- «Дно» стоит 0 баллов
- «Left» стоит 2 балла
- «Центр» стоит 1 балл
- «Правильно» стоит 0 баллов.
Вычтите две оценки друг из друга в вашей функции сравнения и используйте результат в качестве возвращаемого значения.
var objects = [
{ value: 'upperRight' },
{ value: 'upperLeft' },
{ value: 'bottomRight' },
{ value: 'bottomCenter' },
{ value: 'bottomLeft' }
];
function scoreString(s) {
var score = 0;
if (s.indexOf('upper') > -1) score = 20;
if (s.indexOf('Left') > -1) score = 2;
else if (s.indexOf('Center') > -1) score = 1;
return score;
}
var sorted = objects.sort(function (a, b) {
return scoreString(b.value) - scoreString(a.value);
});
console.log(sorted);