为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

沧海一幻觉 2023-01-06 15:53:02

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


 [{

     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,如果有多个相同颜色,则它应该在顶层保留名称属性的排序。


我尝试按以下方式使用 reduce 函数并将它们组合在一起,但没有得到预期的输出。


 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;

   }, { [] })


查看完整描述

2 回答

?
芜湖不芜

TA贡献1544条经验 获得超1个赞

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


扩展:


正如所希望的那样,黄色现在介于橙色和黄色之间。

如果它是绿色的并且评论不是“看起来不错”那么它应该出现在开头。

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


查看完整回答
反对 回复 2023-01-06
?
人到中年有点甜

TA贡献1649条经验 获得超7个赞

您可以创建一个对象,在其中定义颜色顺序,然后使用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)


查看完整回答
反对 回复 2023-01-06
  • 2 回答
  • 0 关注
  • 15 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信