JavaScript 按可为空的 bool 值对数组进行排序,然后按字符串排序

标签 javascript arrays sorting object

我正在尝试对具有可为空 bool 值和标题的对象数组进行排序。如果列表中的某个项目已设置为重要,则 "ReadUnderstood"truefalse,如果不是,则为 。如果 "ReadUnderstood"truenull,但如果值为 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) 相对于彼此移动。减去 bool 值会返回一个数字。所以,第一个条件很好。对于字符串,您需要使用 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)

关于JavaScript 按可为空的 bool 值对数组进行排序,然后按字符串排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57523665/

相关文章:

javascript - 试图做出一个 promise 的决心

javascript - 如何使用复选框将电子邮件保存给订阅者?

javascript - 这个站点如何在不更改页面的情况下更改浏览器的 URL?

php - 更改 array_walk 函数中的数组键?

c - 使用字符串输入的 Switch 语句

javascript - 如何从父窗口添加弹出窗口的某些属性?

java - 如何遍历二维数组并按行主顺序计算每行中有多少个元素大于1

PHP/MySQL 插入不同的数组值

sorting - 从表中找到最小值的最佳方法?

bash - 使用awk对ngram单词进行排序