0
次のコードはうまくいきます。 より洗練された/最適化された方法があるかどうかは不思議です。JavaScript 2D配列グループ化:より洗練された/最適化された方法がありますか?
ロング「コード」データを与え、短い:
var myArray = [
['X', 'A', 0, 1, 'Y', 3],
['X', 'A', 4, 5, 'Y', 6],
['X', 'B', 6, 5, 'Y', 4],
['X', 'B', 3, 2, 'Y', 1],
['X', 'C', 7, 8, 'Y', 9],
];
は、私は列のインデックス1
と合計のみの列インデックス2, 3, 5
によってグループ化したいと言います。
期待される結果は次のとおりです。
[
["A", 4, 6, 9],
["B", 9, 7, 5],
["C", 7, 8, 9]
]
// data
var myArray = [
['X', 'A', 0, 1, 'Y', 3],
['X', 'A', 4, 5, 'Y', 6],
['X', 'B', 6, 5, 'Y', 4],
['X', 'B', 3, 2, 'Y', 1],
['X', 'C', 7, 8, 'Y', 9],
];
// col that I want to group by
var colIndex = 1;
// cols I want to sum
var colsToSum = [2, 3, 5];
var arrayGroupBy = function(myArray, colIndex, colsToSum) {
// get unique column values
var uniqueValues = [];
myArray.forEach(function(row) {
if (uniqueValues.indexOf(row[colIndex]) === -1) {
uniqueValues.push(row[colIndex]);
}
});
var newData = [];
uniqueValues.forEach(function(value) {
// get filtered rows
var filteredRows = myArray.filter(function(row) {
return row[colIndex] === value;
});
var row = [value];
// columns to sum
colsToSum.forEach(function(num) {
if (filteredRows.length === 1) {
// push single row
row.push(filteredRows[0][num]);
} else {
// sum row cols
var total = filteredRows.reduce(function(sum, current) {
return sum + current[num];
}, 0);
row.push(total);
}
});
newData.push(row);
});
return newData;
};
console.log(arrayGroupBy(myArray, colIndex, colsToSum));
残念ながら、私は...この1に
感謝をES6を使用することはできません!