2 回答

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

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; }
添加回答
舉報