Lodash:如何按布尔值对对象数组进行排序?

9

我有一个对象数组需要排序(本质上就是一个表格):

myArr = [{
    name: 'John',
    email: 'john@gmail.com',
    accepted: true
}, {
    name: 'Alfred',
    email: 'alfred@gmail.com',
    accepted: false
}]

我正在使用来自 lodash 的 orderBy,如下所示:

//get columnName to sort by from another function
const newArr = _.orderBy(myArr, [columnName], ['asc'])

按姓名和电子邮件排序很好用,但对于已接受的内容,它似乎没有任何作用。我知道我可以将已接受的内容存储为0和1,但是否还有其他方法?lodash是否足够处理这个问题,或者我应该创建一个单独的函数来处理?


3
没问题 - fiddle - Ori Drori
我真是太蠢了!我的视图层出了点问题... - Runnick
1
Enjoy the view :) - Ori Drori
7
对于偶然看到这个问题的任何人:请注意,因为您正在对布尔值进行排序,实际上您正在对 0 或者 1 进行排序。如果您想将具有 'true' 值的对象放在顶部,则应指定应按 desc 排序(否则 0/false 会排在顶部)。 - Erwin Lengkeek
@Erwin Lengkeek - 我尝试使用3个布尔字段 - 不起作用 - 我认为lodash无法处理这种情况 :( - moshiah_now
2个回答

5
你可以尝试使用ES6表示法。
const newArr = [
    ...myArr.filter(c => c.accepted === false),
    ...myArr.filter(c => c.accepted === true)
];

你还可以使用 Array.sort原型 函数。
myArr.sort((a, b) => (a.accepted - b.accepted));

1
你能在回答中解释一下 ES6 符号表示法代码的作用吗? - Krunal Shah
1
在 ES6 符号中,我们通过连接两个数组来创建一个新的数组。第一个数组包含 accepted === false 过滤的项目,另一个数组包含 accepted === true 过滤的项目。这将把被接受的项目插入到新创建的数组的最后。 - Murtaza Mehmudji

1

@Erwin Lengkeek 那对我有用,通过将我的booleanField降序排序,True出现在顶部。

this.sortableList = orderBy(this.sortableList, ['booleanField', 'stringField'], ['desc', 'asc']);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接