我正在尝试对具有可空布尔值和标题的对象数组进行排序。如果列表中的一项设置为重要,则"ReadUnderstood"
是true
或false
,如果不是,则是null
。如果"ReadUnderstood"
是true
或null
,我希望列表按字母顺序排序,但是如果值是false
,我希望它位于列表的顶部。
下面的代码与我想要的最接近。这将按字母顺序返回列表,其中项目"ReadUnderstood"
是false
在列表顶部。但是"ReadUnderstood"
是true
的项目最终出现在列表的末尾,而不是按字母顺序排列。任何帮助将不胜感激。
items = [
{Title: 'A', ReadUnderstood: null},
{Title: 'C', ReadUnderstood: false},
{Title: 'E', ReadUnderstood: null},
{Title: 'B', ReadUnderstood: true},
{Title: 'D', ReadUnderstood: true},
{Title: 'F', ReadUnderstood: null},
]
items.sort((a, b) => {
return (b.ReadUnderstood != null && b.ReadUnderstood == false) - (a.ReadUnderstood != null && a.ReadUnderstood == false) || a.Title - b.Title;
})
Desired result:
items = [
{Title: 'C', ReadUnderstood: false},
{Title: 'A', ReadUnderstood: null},
{Title: 'B', ReadUnderstood: true},
{Title: 'D', ReadUnderstood: true},
{Title: 'E', ReadUnderstood: null},
{Title: 'F', ReadUnderstood: null},
]
最佳答案
你近了compareFunction
应该返回一个数字,并基于它是正数,负数还是零,被比较的两个项目(a, b)
彼此相对移动。减去布尔值将返回一个数字。因此,第一个条件可以正常工作。对于字符串,您需要使用localeCompare
对其进行字母排序。
另外,您可以简化第一个条件。您无需检查null
并为false
进行严格的相等性检查。
items.sort((a, b) =>
(b.ReadUnderstood === false) - (a.ReadUnderstood === false)
|| a.Title.localeCompare(b.Title)
)
这是一个工作片段:
const items = [
{Title: 'A', ReadUnderstood: null},
{Title: 'C', ReadUnderstood: false},
{Title: 'E', ReadUnderstood: null},
{Title: 'B', ReadUnderstood: true},
{Title: 'D', ReadUnderstood: true},
{Title: 'F', ReadUnderstood: null},
]
items.sort((a, b) =>
(b.ReadUnderstood === false) - (a.ReadUnderstood === false)
|| a.Title.localeCompare(b.Title)
)
console.log(items)