亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

按多個條件和可能的未定義值對對象數組進行排序

按多個條件和可能的未定義值對對象數組進行排序

守著星空守著你 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 關注
  • 134 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號