假设我有一个对象数组,例如:

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;
});


然后按其属性queuedPostsqueued进行排序,然后按unqueuedPostsscore依次对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)

10-06 15:29