我正在制作一个排序函数,其中按值排序将是动态的,并且数组中对象中的某些属性值可以为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));