将包含avg数据的新对象添加到javascript数组中

时间:2016-06-18 12:04:43

标签: javascript underscore.js

我的基础数据结构..

[{
        month: 'Jan',day:1
        cat: 'A',
        type:'val', val: 20
    },{
        month: 'Jan',day:1
        cat: 'B',
        type:'val', val: 5
    },{
        month: 'Jan',day:2
        cat: 'A',
        type:'val', val: 10
    },{
        month: 'Jan',day:2
        cat: 'B',
        type:'val', val: 10
    },{
        month: 'Feb',day:1
        cat: 'A',
        type:'val', val: 30
    },{
        month: 'Feb',day:1
        cat: 'B',
        type:'val', val: 10
    },{
        month: 'Feb',day:2
        cat: 'A',
        type:'val', val: 20
    },{
        month: 'Feb',day:2
        cat: 'B',
        type:'val', val: 20
    }];

以下是我需要做的事情:

a)获取每个独特属性'cat'的属性'val'和'day'说cat:'A'和day:1

b)对上述步骤中的所有值进行平均处理,因此对于每个独特属性“cat”和“day”,我们得到平均值。 VAL

c)查找数组中具有上述属性'cat'和'day'

值的所有对象

d)克隆对象,使得数组中的原始对象不会被更改

e)将克隆对象类型更新为'avg',将val更新为'avg value recd in step(b)'

f)将新对象添加到基础数据数组中。

因此,最后,数组将具有之前的值的两倍,并且数组中的新对象将是以下内容。

{
        month: 'Jan',day:1
        cat: 'A',
        type:'avg', val: 25 //20+30/2
    },{
        month: 'Jan',day:1
        cat: 'B','
        type:'avg', val: 7.5 //5+10/2
    },{
        month: 'Jan',day:2
        cat: 'A',
        type:'avg', val: 15 //10+20/2
    },{
        month: 'Jan',day:2
        cat: 'B',
        type:'avg', val: 15 //10+20/2
    },{
        month: 'Feb',day:1
        cat: 'A',
        type:'avg', val: 25
    },{
        month: 'Feb',day:1
        cat: 'B',
        type:'avg', val: 7.5
    },{
        month: 'Feb',day:2
        cat: 'A',
        type:'avg', val: 15
    },{
        month: 'Feb',day:2
        cat: 'B',
        type:'avg', val: 15
    }
答案:感谢Nina,我能够解决这个问题,我无法正确解释我的需求。以下是我正在寻找的......

hash = Object.create(null),
    result = data.map(function (a, i) {
        var key = a.day + '|' + a.cat;
        this[key] = this[key] || { indices: [], sum: 0 };
        this[key].indices.push(i);
        this[key].sum += a.val;
        return { month: a.month, day: a.day, cat: a.cat, type: 'avg' };
    }, hash);

Object.keys(hash).forEach(function (k) {
    hash[k].indices.forEach(function (i) {
        result[i].val = hash[k].sum / hash[k].indices.length;
    });
});
final_result= $.merge( $.merge( [], data ), result );

1 个答案:

答案 0 :(得分:2)

这是一个普通Javascript中的提案,其中一个对象作为平均计算所需组的哈希表。

var data = [{ month: 'Jan', day: 1, cat: 'A', type: 'val', val: 20 }, { month: 'Jan', day: 1, cat: 'B', type: 'val', val: 5 }, { month: 'Jan', day: 2, cat: 'A', type: 'val', val: 10 }, { month: 'Jan', day: 2, cat: 'B', type: 'val', val: 10 }, { month: 'Feb', day: 1, cat: 'A', type: 'val', val: 30 }, { month: 'Feb', day: 1, cat: 'B', type: 'val', val: 10 }, { month: 'Feb', day: 2, cat: 'A', type: 'val', val: 20 }, { month: 'Feb', day: 2, cat: 'B', type: 'val', val: 20 }],
    hash = Object.create(null),
    result = data.map(function (a, i) {
        var key = a.day + '|' + a.cat;
        this[key] = this[key] || { indices: [], sum: 0 };
        this[key].indices.push(i);
        this[key].sum += a.val;
        return { month: a.month, day: a.day, cat: a.cat, type: 'avg' };
    }, hash);

Object.keys(hash).forEach(function (k) {
    hash[k].indices.forEach(function (i) {
        result[i].val = hash[k].sum / hash[k].indices.length;
    });
});

console.log(result);