Как мы можем сортировать объекты js с двойным условием

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