@kimatat773

Как сортировать с приоритетом массив?

Подскажите как сделать сортировку и выборку из массива. Как мне отсортировать в функции getSortBy, чтоб он сперва вернул двойные группы у которых source равен 1 и 0, если таких нет, то у тройных групп где source равен 1,1 и 0 ,если таких нет, то у тройных где source равен 2,2 и 0, если и тройных нет, то чтоб вернул объект у кого source равен 0. Извиняюсь сразу за то что возможно я не так сформулировал вопрос или возможно покажется вопрос заданием. Мне просто объясните пожалуйста
const arr = [
   {id: 1, groupId: 100, source: 1},
  {id: 2, groupId: 100, source: 2},
  {id: 3, groupId: 100, source: 1},
  {id: 4, groupId: 200, source: 1},
  {id: 5, groupId: 200, source: 0},
  {id: 6, groupId: 300, source: 1},
  {id: 7, groupId: 300, source: 0},
  {id: 8, groupId: 300, source: 1},
  {id: 9, groupId: 400, source: 1},
  {id: 10, groupId: 400, source: 0},
  {id: 11, groupId: 400, source: 0},
  {id: 12, groupId: 500, source: 2},
  {id: 13, groupId: 500, source: 1},
];
function getSortBy() {
 
}
  • Вопрос задан
  • 492 просмотра
Решения вопроса 1
@dimoff66
Кратко о себе: Я есть
С гибкими правилами

function getSortBy(arr, rules = ['10', '110', 220]) {
  const groupedMap = arr.reduce((agg, v) => {
    if (!agg[v.groupId]) agg[v.groupId] = []
    agg[v.groupId].push(v)
    return agg
  }, {})

  const groups = Object
    .values(groupedMap)
    .map(arr => arr.sort((a, b) => b.source - a.source))

  const indexedGroups =
    groups
      .map(arr => ({ 
        arr, 
        sortIndex: (rules.indexOf(arr.map(v => v.source).join('')) + 1) || 1000
      }))

  const sortedGroups =
    indexedGroups.sort((a, b) => a.sortIndex - b.sortIndex)

  const firstGroup = sortedGroups[0].arr
  const element = firstGroup.find(v => v.source === 0)

  return element
}

const arr = [
  {id: 1, groupId: 100, source: 1},
 {id: 2, groupId: 100, source: 2},
 {id: 3, groupId: 100, source: 1},
 {id: 4, groupId: 200, source: 1},
 {id: 5, groupId: 200, source: 0},
 {id: 6, groupId: 300, source: 1},
 {id: 7, groupId: 300, source: 0},
 {id: 8, groupId: 300, source: 1},
 {id: 9, groupId: 400, source: 1},
 {id: 10, groupId: 400, source: 0},
 {id: 11, groupId: 400, source: 0},
 {id: 12, groupId: 500, source: 2},
 {id: 13, groupId: 500, source: 1},
];

console.log(getSortBy(arr))  // { groupId: 200, id: 5, source: 0 }

const arr2 = [
   {id: 1, groupId: 100, source: 1},
  {id: 2, groupId: 100, source: 2},
  {id: 3, groupId: 100, source: 1},
  {id: 4, groupId: 200, source: 1},
  {id: 5, groupId: 200, source: 2},
  {id: 6, groupId: 300, source: 1},
  {id: 7, groupId: 300, source: 0},
  {id: 8, groupId: 300, source: 1},
  {id: 9, groupId: 400, source: 1},
  {id: 10, groupId: 400, source: 2},
  {id: 11, groupId: 400, source: 2},
  {id: 12, groupId: 500, source: 2},
  {id: 13, groupId: 500, source: 1},
];

console.log(getSortBy(arr2)) // { groupId: 300, id: 7, source: 0 }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@alexalexes
Первым действием перетранслируйте этот массив во вспомогательную структуру:
{
    100: // groupId
    {
       1:  [1, 3], // source: [id, id, .....]
       2: [2]
    },
   ......
}

Тогда вам будет проще снимать метрики для сортировки: считать какие source есть у группы (сколько, каких нет), и какие id входят в source.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы