给定以下数组:我想按时间戳
对所有内容进行分组,并根据如果
。请参阅下面我想要的结果...subGroup
满足,则对real
求和主组
var arr = [
{
mainGroup: 'A',
subGroup: 'B',
real: 100,
timestamp: '2017-01-15T01:00:00.000Z'
},
{
mainGroup: 'A',
subGroup: 'C',
real: 150,
timestamp: '2017-01-15T01:00:00.000Z'
},
{
mainGroup: 'B',
subGroup: 'D',
real: 123,
timestamp: '2017-01-15T01:00:00.000Z'
},
{
mainGroup: 'B',
subGroup: 'Y',
real: 542,
timestamp: '2017-01-15T01:00:00.000Z'
}
]
结果将是:
[
{
A: 250, // 250 is sub B real + sub C real.
B: 665, // 665 is sub D real + sub Y real.
timestamp: '2017-01-15T01:00:00.000Z'
},
]
到目前为止我的代码:
var arr = [
{
mainGroup: 'A',
subGroup: 'B',
real: 100,
timestamp: '2017-01-15T01:00:00.000Z'
},
{
mainGroup: 'A',
subGroup: 'C',
real: 150,
timestamp: '2017-01-15T01:00:00.000Z'
},
{
mainGroup: 'B',
subGroup: 'D',
real: 123,
timestamp: '2017-01-15T01:00:00.000Z'
},
{
mainGroup: 'B',
subGroup: 'Y',
real: 542,
timestamp: '2017-01-15T01:00:00.000Z'
}
]
let b = arr.reduce((a, item) => {
a[item.timestamp] = a[item.timestamp] || {};
Object.assign(a[item.timestamp], {
[item.mainGroup]: item.real
});
return a;
}, {});
Object.keys(b)
.map(timestamp => Object.assign(b[timestamp], { timestamp }));
console.log(b)
最佳答案
您可以使用对象来引用组。
var array = [{ mainGroup: 'A', subGroup: 'B', real: 100, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'A', subGroup: 'C', real: 150, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'B', subGroup: 'D', real: 123, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'B', subGroup: 'Y', real: 542, timestamp: '2017-01-15T01:00:00.000Z' }],
grouped = [];
array.forEach(function (a) {
if (!this[a.timestamp]) {
this[a.timestamp] = { timestamp: a.timestamp };
grouped.push(this[a.timestamp]);
}
this[a.timestamp][a.mainGroup] = (this[a.timestamp][a.mainGroup] || 0) + a.real;
}, Object.create(null));
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
var array = [{ mainGroup: 'A', subGroup: 'B', real: 100, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'A', subGroup: 'C', real: 150, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'B', subGroup: 'D', real: 123, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'B', subGroup: 'Y', real: 542, timestamp: '2017-01-15T01:00:00.000Z' }],
grouped = array.reduce(function (hash) {
return function (r, a) {
if (!hash[a.timestamp]) {
hash[a.timestamp] = { timestamp: a.timestamp };
r.push(hash[a.timestamp]);
}
hash[a.timestamp][a.mainGroup] = (hash[a.timestamp][a.mainGroup] || 0) + a.real;
return r;
};
}(Object.create(null)), []);
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
ES6 带有 Array#reduce
var array = [{ mainGroup: 'A', subGroup: 'B', real: 100, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'A', subGroup: 'C', real: 150, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'B', subGroup: 'D', real: 123, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'B', subGroup: 'Y', real: 542, timestamp: '2017-01-15T01:00:00.000Z' }],
grouped = array.reduce((hash => (r, a) => {
if (!hash[a.timestamp]) {
hash[a.timestamp] = { timestamp: a.timestamp };
r.push(hash[a.timestamp]);
}
hash[a.timestamp][a.mainGroup] = (hash[a.timestamp][a.mainGroup] || 0) + a.real;
return r;
})(Object.create(null)), []);
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
关于javascript - 对象数组,条件满足时更改为新结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41666020/