У меня есть список объектов в следующей структуре, которые уже отсортированы по свойству имени на верхнем уровне.

 [{
     name: 'name1'
     team: 'team1'
     statuses: [{ time: 'day1', color: 'green', message: 'looks good'}, { time: 'day2', color: 'green', message: 'looks good'}]
    },
    {
     name: 'name2'
     team: 'team2'
     statuses: [{ time: 'day1', color: 'yellow', message: 'mild concern'}, { time: 'day2', color: 'red', message: 'critical issue'}]
    },
    {
     name: 'name3'
     team: 'team3'
     statuses: [{ time: 'day1', color: 'orange', message: 'mild concern'}, { time: 'day2', color: 'orange', message: 'potential issue'}]
    }]

Приведенный выше список должен быть отсортирован в соответствии с настраиваемым порядком сортировки (красный, оранжевый, зеленый) на основе свойства цвета последнего объекта в списке состояний. Ожидаемый список содержит объекты в этом порядке team2, team3, team1, если их несколько, одного цвета, тогда он должен сохранить свойство сортировки имени на верхнем уровне.

Я попытался использовать функцию сокращения следующим образом и объединил их все вместе, но не получил ожидаемого результата.

 teams.reduce((r, t) => {
     if(t.statuses[1].color === 'red');
       r.push(t)
    return r;
   }, { [] })
  
   teams.reduce((r, t) => {
     if(t.statuses[1].color === 'orange');
       r.push(t)
    return r;
   }, { [] })

   teams.reduce((r, t) => {
     if(t.statuses[1].color === 'green');
       r.push(t)
    return r;
   }, { [] })
0
user1614862 13 Авг 2020 в 12:14

1 ответ

Вы можете создать один объект, в котором вы определяете порядок цветов, а затем использовать метод sort, в котором вы сначала сортируете по цветам, а если цвета совпадают, вы сортируете по имени

const data = [{"name":"name1","team":"team1","statuses":[{"time":"day1","color":"green","message":"looks good"},{"time":"day2","color":"green","message":"looks good"}]},{"name":"name2","team":"team2","statuses":[{"time":"day1","color":"yellow","message":"mild concern"},{"time":"day2","color":"red","message":"critical issue"}]},{"name":"name3","team":"team3","statuses":[{"time":"day1","color":"orange","message":"mild concern"},{"time":"day2","color":"orange","message":"potential issue"}]}]

const order = {
  red: 1,
  orange: 2,
  green: 3
}

data.sort((a, b) => {
  const aColor = a.statuses.slice(-1)[0].color;
  const bColor = b.statuses.slice(-1)[0].color;
  return order[aColor] - order[bColor] || a.name.localeCompare(b.name)
})

console.log(data)
1
Nenad Vracar 13 Авг 2020 в 09:30