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

Как мы можем отсортировать эти объекты сверху->снизу, и в то же время слева->центр->справа?

{value: "upperRight"}
{value: "upperLeft"}
{value: "bottomRight"}
{value: "bottomCenter"}
{value: "bottomLeft"}

Что вы пробовали?

theBittor 23.12.2020 15:05
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Array.prototype.sort() позволяет указать функцию сравнения. Просто установите несколько основных правил того, как вы оцениваете строку. Например:

  • «Верхний» оценивается в 10 баллов.
  • "Нижний" стоит 0 баллов
  • "Левая" оценивается в 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.info(sorted);
Ответ принят как подходящий
  • 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.info(array)

Если операция split дорогая, вы можете добавить операцию map, чтобы заранее получить все разделенные значения и отсортировать их.

Другие вопросы по теме