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

按多个条件和可能的未定义值对对象数组进行排序

按多个条件和可能的未定义值对对象数组进行排序

守着星空守着你 2023-08-05 19:32:45
我正在尝试对我的 javascript 对象数组进行排序ownerName     dogCode   dogNameBob           5         RexJohn        Alisha        3         MoonDarren        4         Boss  JoshCerq我希望它首先按dogCode排序(无论是否存在,忽略数字),然后按ownerName排序,最后按dogName排序,如下所示:ownerName     dogCode   dogNameAlisha        3         MoonBob           5         Rex    Darren        4         Boss CerqJohn        Josh我试过这个:data.sort(function (a, b) {    if (a.dogCode < b.dogCode || !a.dogCode) return 1;    if (a.dogCode > b.dogCode || !b.dogCode) return -1;    if (a.ownerName < b.ownerName || !a.ownerName) return 1;    if (a.ownerName > b.ownerName || !b.ownerName) return -1;    if (a.dogName < b.dogName || !a.dogName) return 1;    if (a.dogName > b.dogName || !b.dogName) return -1;     return 0;});显然,它是按dogCode 正确排序的,但不是按名称/dogName 排序的。我怎样才能做到这一点?编辑:这是我的 json 对象:{  "data": [    {      "ownerName": "Bob",      "dogCode": "5",      "dogName": "Rex"    },    {      "ownerName": "John"    },    {      "ownerName": "Alisha",      "dogCode": "3",      "dogName": "Moon"    },    {      "ownerName": "Darren",      "dogCode": "4",      "dogName": "Bos"    },    {      "ownerName": "Josh"    },    {      "ownerName": "Cerq"    }  ]}
查看完整描述

2 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

这可能不是最有效的方法,但我发现下面的代码很容易理解。请注意,排序需要按照与列出它们的顺序相反的顺序进行。


const obj = {

  "data": [

    {

      "ownerName": "Bob",

      "dogCode": "5",

      "dogName": "Rex"

    },

    {

      "ownerName": "John"

    },

    {

      "ownerName": "Alisha",

      "dogCode": "3",

      "dogName": "Moon"

    },

    {

      "ownerName": "Darren",

      "dogCode": "4",

      "dogName": "Bos"

    },

    {

      "ownerName": "Josh"

    },

    {

      "ownerName": "Cerq"

    }

  ]

};


const byPropExists = prop => (a, b) => {

  if (a[prop] !== undefined && b[prop] === undefined) return -1;

  if (a[prop] === undefined && b[prop] !== undefined) return 1;

  return 0;

}

const byPropValue = prop => (a, b) => a[prop]?.localeCompare(b[prop])


// Note the reverse order of your sorts

console.log(obj.data

  .sort(byPropValue('dogName'))

  .sort(byPropValue('ownerName'))

  .sort(byPropExists('dogCode'))

);


查看完整回答
反对 回复 2023-08-05
?
哔哔one

TA贡献1854条经验 获得超8个赞

您可以将未定义检查的增量作为排序值,并按数字增量或String#localeCompare字符串进行排序。

const data = [{ ownerName: 'Bob', dogCode: 5, dogName: 'Rex' }, { ownerName: 'John' }, { ownerName: 'Alisha', dogCode: 3, dogName: 'Moon' }, { ownerName: 'Darren', dogCode: 4, dogName: 'Boss' }, { ownerName: 'Josh' }, { ownerName: 'Cerq' }];


data.sort((a, b) =>

    (a.dogCode === undefined) - (b.dogCode === undefined) ||

    (a.ownerName === undefined) - (b.ownerName === undefined) ||

    (a.dogName === undefined) - (b.dogName === undefined) ||


    (a.ownerName || '').localeCompare(b.ownerName || '') ||

    a.dogCode - b.dogCode ||

    (a.dogName || '').localeCompare(b.dogName || '')

);

   

console.log(data);

.as-console-wrapper { max-height: 100% !important; top: 0; }



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

添加回答

举报

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