使用lodash/下划线聚合排序限制

aggregate sort limit with lodash/underscore

本文关键字:排序 lodash 下划线 使用      更新时间:2023-09-26

我需要聚合我的数据。如果我使用mongodb聚合,这会很容易,但我想在客户端执行。LoDash或Undercore应该解决这个问题。。。

假设我有这个数据:

var data = [
    {
        "uId" : "u1",
        "qId" : "q1",
        "share" : 2,
        "star"  :   2,
        "score" : 5
    },
    {
        "uId" : "u1",
        "qId" : "q2",
        "share" : 2,
        "star"  :   2,
        "score" : 5
    }.
    {
        "uId" : "u2",
        "qId" : "q1",
        "share" : 2,
        "star"  :   2,
        "score" : 5
    },
    {
        "uId" : "u2",
        "qId" : "q2",
        "share" : 3,
        "star"  :   3,
        "score" : 7
    },
    {
        "uId" : "u3",
        "qId" : "q1",
        "share" : 3,
        "star"  :   3,
        "score" : 7
    },
    {
        "uId" : "u3",
        "qId" : "q2",
        "share" : 3,
        "star"  :   3,
        "score" : 7
    }
]

我需要这个结果:

result = [
    {
        "uId" : "u3",
        "qId" : 2,
        "share" : 6,
        "star"  :   6,
        "score" : 14
    },
    {
        "uId" : "u2",
        "qId" : 2,
        "share" : 5,
        "star"  :   5,
        "score" : 12
    }
]

它按最高分数排序,并将结果限制为仅显示2个结果

谢谢。。。

您也可以在下划线中执行此操作。

_.sortBy(data, 'score').reverse().splice(0, 2);

但不确定反过来会有多好的表现。

编辑:

得到了它没有反向:

_.sortBy(data, function (el) { return -el.score; }).splice(0, 2);

您可以使用lodash:

_.map(_.sortByOrder(data, ['score'], ['desc']), _.values).slice(0,2);

首先,它将创建一个排序数组,然后将结果限制为只有两个结果。