gpt4 book ai didi

javascript - Underscore.js:过滤对象数组,然后按平均值排序?

转载 作者:行者123 更新时间:2023-11-28 06:22:00 25 4
gpt4 key购买 nike

我有一个如下所示的数据数组,按月份升序排序:

[{
org_id: "K83002",
percentile: 1,
date: "2013-11-01",
},
{
org_id: "K83059",
percentile: 33,
date: "2013-12-01",
},
{
org_id: "K83607",
percentile: 22,
date: "2013-12-01",
} ...

我想创建一个组织排序列表,按最近三个月数据中的平均百分位数排名。

现在,我正在这样做:

            var lastThreeMonths = _.uniq(_.pluck(data, 'date'), true).slice(-3);
var averages = {};
var lastMonths = _.each(data, function(d) {
if (_.contains(lastThreeMonths, d.date)) {
if (d.org_id in averages) {
averages[d.org_id] += d.percentile;
} else {
averages[d.org_id] = d.percentile;
}
}
});
var temp = [];
for (var k in averages) {
temp.push({ 'org_id': k, 'percentile': averages[k]});
}
var sortedAvgs = _.sortBy(temp, 'percentile').reverse();

但这非常冗长。有更好的方法吗?

理想情况下,我还想以某种方式将每个组织的原始数据附加到排序数组中,因为接下来我将迭代排序数组,并且访问该迭代器内的数据会很方便。

最佳答案

这应该对您有帮助:

// Create a hash of allowed dates - much improved performance over arrays for larger data sets
var lastThreeMonthsHash = _.chain(data).pluck('date').uniq().slice(-3).map(function (date) {
return [date, true]
}).object().value();

// filter out older entries
var grouped = _.chain(data).filter(function (monthly) {
return lastThreeMonthsHash[monthly.date];
// group by org_id
}).groupBy('org_id').map(function (values, orgId) {
// reduce each group into a single value which is the average percentile
var percentiles = _.pluck(values, 'percentile');
var sum = _.reduce(percentiles, function (memo, value) {
return memo + value;
}, 0);
return {
org_id : orgId,
percentile: sum / values.length
};
// sort by percentile & reverse
}).sortBy('percentile').reverse().value();

关于javascript - Underscore.js:过滤对象数组,然后按平均值排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35440988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com