Как мы можем отсортировать эти объекты сверху->снизу, и в то же время слева->центр->справа?
{value: "upperRight"}
{value: "upperLeft"}
{value: "bottomRight"}
{value: "bottomCenter"}
{value: "bottomLeft"}
Array.prototype.sort() позволяет указать функцию сравнения. Просто установите несколько основных правил того, как вы оцениваете строку. Например:
Вычтите две оценки друг из друга в своей функции сравнения и используйте результат в качестве возвращаемого значения.
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.info(sorted);
split
каждый value
в /(?=[A-Z])/
, чтобы получить их вертикальное и горизонтальное положение. Это создаст такой массив: ["upper", "Right"]
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.info(array)
Если операция split
дорогая, вы можете добавить операцию map
, чтобы заранее получить все разделенные значения и отсортировать их.
Что вы пробовали?