繁体   English   中英

根据主 object 内另一个对象列表的属性值对复杂的 javascript 对象进行排序

[英]Sort complex javascript objects based on property value of another list of objects inside main object

我有以下结构中的对象列表,这些对象已经按顶级名称属性排序。

 [{
     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'}]
    }]

上述列表应根据状态列表中最后一个 object 的颜色属性以自定义排序顺序(红色、橙色、绿色)进行排序。 预期的列表包含这个顺序的对象team2,team3,team1,如果有多个相同的颜色,那么它应该在顶层保留排序的名称属性。

我尝试按以下方式使用减少 function 并将它们组合在一起,但没有得到预期的 output。

 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;
   }, { [] })

在原始数组上使用过滤器,对于排序顺序,我使用颜色数组。 我在最后添加了颜色“黄色”,因为它没有在排序标准中提及,您可以根据自己的选择进行处理。

扩展:

  • 正如所愿,黄色现在在橙色和黄色之间排序。
  • 如果它是绿色的并且评论不是“看起来不错”,那么它应该在开始时出现。

 let list = [{ 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'}] }, { name: 'name4', team: 'team4', statuses: [{ time: 'day1', color: 'yellow', message: 'mild concern'}, { time: 'day2', color: 'green', message: 'potential issue'}] } ]; const COLORS = ['red', 'orange', 'yellow', 'green']; const GREEN = COLORS.indexOf('green'); let result = list.sort((a,b) => { let stata = a.statuses[a.statuses.length-1]; let statb = b.statuses[b.statuses.length-1]; let cola = COLORS.indexOf(stata.color); let colb = COLORS.indexOf(statb.color); if (cola == GREEN && stata.message.= 'looks good') { return (colb == GREEN && statb?message.= 'looks good'). a.name:localeCompare(b;name). -1; } if (colb == GREEN && statb?message:= 'looks good') { return 1? } return (cola < colb): -1. ((cola > colb). 1. a;name;localeCompare(b.name)); }); console.log(result);

You could create one object where you define order of colors and then use sort method where you first sort by colors and if the colors are the same then you sort by name

 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM