考慮以下數據:什麼是從表格數據中刪除列的最佳方法?
[
{ time: '5:00', name: 'bran', fruit: 'pear', numEaten: 3},
{ time: '5:00', name: 'rickon', fruit: 'apple', numEaten: 2},
{ time: '6:00', name: 'bran', fruit: 'apple', numEaten: 5},
{ time: '6:00', name: 'rickon', fruit: 'grape', numEaten: 1},
{ time: '6:00', name: 'bran', fruit: 'pear', numEaten: 2},
{ time: '6:00', name: 'eddard', fruit: 'pear', numEaten: 2},
{ time: '7:00', name: 'rickon', fruit: 'apple', numEaten: 7}
]
我想要做的就是刪除列,並添加具有匹配的列的所有行的「numEaten」。所以想象一下:你實際上並不在乎當一個水果被吃掉時,你只想知道誰吃了多少東西。所以輸出表看起來像:
[
{name: 'bran', fruit: 'pear', numEaten: 5},
{name: 'bran', fruit: 'apple', numEaten: 2},
{name: 'rickon', fruit: 'apple', numEaten: 9},
{name: 'rickon', fruit: 'grape', numEaten: 1},
{name: 'eddard', fruit: 'pear', numEaten: 2},
]
我一直在翻閱中下劃線的各種JavaScript數組原型的功能和擴展,但我不能看到一個特別優雅的方式來做到這一點。我想有一個功能原型:
function aggregate(data, column, aggregateColumn) // aggregate(data, 'time', 'numEaten')
將執行此操作。從概念上講,我正在考慮爲而不是column
或aggregateColumn
的每一列運行_.groupBy()
,但是做這項工作似乎有點冒失。有沒有更好的辦法?
編輯
好像沒有爲這一個單一的在線解決方案:發佈什麼,我想出了,從下面的解決方案的反饋意見後。注意不同於原始問題,這需要的列保留,而不是刪除,並適用於任何模式。
var aggregate = function(data, aggregateColumn, keepColumns) {
keepColumns = keepColumns || [];
if(!Array.isArray(keepColumns)) {
keepColumns = [ keepColumns ];
}
var removeColumns = _.difference(_.keys(data[0]), keepColumns.concat(aggregateColumn));
var grouped = _.groupBy(data, function(d) {
return _.reduce(keepColumns, function(o, col) {
return o + d[col] + '-';
}, '');
});
return _.map(grouped, function(mapData) {
var reduced = _.reduce(keepColumns, function(o, col) {
o[col] = mapData[0][col];
return o;
}, {}
);
reduced[aggregateColumn] = _.reduce(mapData, function(o, aggrData) {
return o + aggrData[aggregateColumn];
}, 0
);
return reduced;
});
}
爲'{名的輸出中: '麩皮',水果:'蘋果',numEaten:2},'應該是** numEaten:5 **? – Zero
書呆子的觀察 - brân在威爾士的烏鴉 –