Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Underline.js:过滤对象数组,然后按平均值排序?_Javascript_Underscore.js - Fatal编程技术网

Javascript Underline.js:过滤对象数组,然后按平均值排序?

Javascript Underline.js:过滤对象数组,然后按平均值排序?,javascript,underscore.js,Javascript,Underscore.js,我有一个数据数组,如下所示,按月份升序排序: [{ 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", } ... 我想创建一个组织的排序列表,根据其在数据中最近三个月的平

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

[{
  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();
但这是非常冗长的。有更好的方法吗

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

您可以尝试以下方法:

var sortedAverages = _.chain(data)
  .filter(d => _.contains(lastThreeMonths, d.date))
  .groupBy('org_id')
  .map(eachOrg => {
    var average =  _.sum(_.pluck(eachOrg, 'percentile'));
    return {
      org_id : eachOrg.org_id,
      percentile : average
    };
  })
  .sortBy('percentile')
  .value()
  .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();

你能再多展示一下输入和输出吗?谢谢!这很好而且紧凑,但我不确定如何重写它以实现ES6之前的兼容性。另外,
eachOrg
从何而来?eachOrg实际上是一个函数参数。阅读ES6箭头函数。如果您在es5中创建它,它看起来像:
function(eachOrg){/*…*/}