使用localeCompare对对象数组进行排序,值可能为false



我正在制作一个排序函数,其中按值排序将是动态的,并且数组中对象中的某些属性值可以为false。

我想使用localeCompare,因为可能有特殊字符等

如示例中所示,如果false

值位于数组的中间,则中断。我确实尝试实现可选的更改,但它根本不起作用:

return a.sortValue?.[1].localeCompare(b.sortValue?.[1])

预期结果为:

foruser_id:4123

partner_id:413.2

Sort value总是(当不为false时)在数组的第一个索引中。我想把false放在最后,我仍然需要它在列表中…

如果不做一些自定义排序函数,这是可能的吗?

let arr = [{
id: 1,
user_id: ["ignoreThis", 'B'],
partner_id: ["ignoreThis", 'B']
},
{
id: 2,
user_id: ["ignoreThis", 'D'],
partner_id: false
},
{
id: 3,
user_id: false,
partner_id: ["ignoreThis", 'D']
},
{
id: 4,
user_id: ["ignoreThis", 'A'],
partner_id: ["ignoreThis", 'A']
}
]
const sortBy = sortValue => {
arr.sort(function(a, b) {
return a[sortValue][1].localeCompare(b[sortValue][1])
})
}
sortBy('user_id')
arr.forEach(i => console.log(i.id))
sortBy('partner_id')
arr.forEach(i => console.log(i.id))
.as-console-wrapper {
min-height: 100% !important;
}

可以先检查值,然后按需要的值排序。这种方法需要一个默认的空字符串来使用localeCompare

const
array = [{ id: 1, user_id: ["ignoreThis", 'B'], partner_id: ["ignoreThis", 'B'] }, { id: 2, user_id: ["ignoreThis", 'D'], partner_id: false }, { id: 3, user_id: false, partner_id: ["ignoreThis", 'D'] }, { id: 4, user_id: ["ignoreThis", 'A'], partner_id: ["ignoreThis", 'A'] }] 
sortBy = key => array.sort((a, b) =>
!a[key] - !b[key] ||
(a[key]?.[1] || '').localeCompare(b[key]?.[1])
);
sortBy('user_id');
console.log(...array.map(({ id }) => id));
sortBy('partner_id');
console.log(...array.map(({ id }) => id));

最新更新