假设我有一个对象数组,例如:
var posts = [{
queued: false,
score: 3
}, {
queued: false,
score: 2
}, {
queued: false,
score: 1
}, {
queued: 100,
score: 0
}, {
queued: 56,
score: 1
}]
我想基于
queued
属性进行拆分,一个数组具有所有queued: false
,另一个数组具有其他所有内容。然后,我想按score
排序并加入它们。我可以执行以下操作:
let queuedPosts = _.filter(posts, function(post) {
return post.queued !== false;
});
let unqueuedPosts = _.filter(posts, function(post) {
return post.queued === false;
});
然后按其属性
queuedPosts
对queued
进行排序,然后按unqueuedPosts
和score
依次对posts = _.concat(queuedPosts, unqueuedPosts)
进行排序。如果将来我要被其他财产分割,这将无法扩展。有什么更干净的方法可以做到这一点?编辑:
代码目前看起来像这样
sortPosts(posts) {
let queuedPosts = _.filter(posts, (post) => (post.queued !== false));
let unqueuedPosts = _.difference(posts, queuedPosts);
queuedPosts = orderBy(queuedPosts, 'queued', 'asc');
unqueuedPosts = orderBy(unqueuedPosts, 'score', 'desc');
return [...queuedPosts, ...unqueuedPosts];
}
我相信,如果我使用
_.remove
方法,则可以以编程方式使用包含键,排序顺序和限制的另一个对象,可以通过一些复选框的输入来修改此对象,以根据用户的需求动态地进行排序。 最佳答案
我只需要使用一个.sort()
操作即可一步完成所有操作。您无需先拆分阵列。
我发现您的措辞有些混乱,但是我对所需结果的解释如下:
非错误的queued
项目首先出现,按queued
,然后按score
排序
最后出现的queued: false
个项目,按score
排序
var posts = [
{ queued: false, score: 3 },
{ queued: false, score: 2 },
{ queued: 100, score: 10 },
{ queued: false, score: 1 },
{ queued: 100, score: 0 },
{ queued: 56, score: 1 }
]
var sorted = posts.slice().sort(function(a,b) {
return a.queued === b.queued
? a.score - b.score
: !a.queued ? 1 : !b.queued ? -1 : a.queued - b.queued
})
console.log(sorted)