将具有平均数据的新对象添加到 javascript 数组
adding new objects with avg data to javascript array
我的基础数据结构..
[{
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' 和 'day' 得到 属性 'val' 说 cat:'A' 和 day:1
b) 对上述步骤中记录的所有值取平均值,因此对于每个唯一的 属性 'cat' 和 'day' 我们得到一个平均值。瓦尔
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 );
这是一个简单的提案 Javascript,其中一个对象作为散列 table,用于平均计算所需的组。
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);
我的基础数据结构..
[{
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' 和 'day' 得到 属性 'val' 说 cat:'A' 和 day:1
b) 对上述步骤中记录的所有值取平均值,因此对于每个唯一的 属性 'cat' 和 'day' 我们得到一个平均值。瓦尔
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 );
这是一个简单的提案 Javascript,其中一个对象作为散列 table,用于平均计算所需的组。
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);