Javascript中的分组数据

Javascript中的分组数据,javascript,arrays,grouping,Javascript,Arrays,Grouping,我有一个CSV,我正在通过CSV to array加载到内存中,它返回一个对象数组,每行数据都有键值对,键值是列,值是与该列关联的数据。因此: [{col1: 'id1', col2: '123', col3: '12/01/12'}, {col1: 'id1', col2: '100', col3: '12/01/12'}, {col1: 'id2', col2: '-100', col3: '12/01/12'}, {col1: 'id2', col2: '123', col3: '13/0

我有一个CSV,我正在通过CSV to array加载到内存中,它返回一个对象数组,每行数据都有键值对,键值是列,值是与该列关联的数据。因此:

[{col1: 'id1', col2: '123', col3: '12/01/12'},
{col1: 'id1', col2: '100', col3: '12/01/12'},
{col1: 'id2', col2: '-100', col3: '12/01/12'},
{col1: 'id2', col2: '123', col3: '13/01/12'}]
我想能够做的是基于特定列对数据进行分组,例如,对于12/01/12数据上的id1,col2列的总和是多少。或者对于id2,12/01/12和13/01/12之间col2中的值之间的差异是什么


对JS来说是相当新的(1周),所以对此的任何建议都将不胜感激

我创建了一个函数,它的参数是一个字符串,表示列名。在这个示例中,我传入了
“col1”
——ID列

该函数创建一个空对象。它循环遍历数据数组并检查是否已存储具有相同ID的对象。如果没有,我将创建一个与ID同名的新属性,并为其分配一个空数组

此空数组将包含具有相同ID的对象

示例

var数据=[
{col1:'id1',col2:'123',col3:'12/01/12'},
{col1:'id1',col2:'100',col3:'12/01/12'},
{col1:'id2',col2:'-100',col3:'12/01/12'},
{col1:'id2',col2:'123',col3:'13/01/12'}
];
函数sortData(columnName){
var sortedData={};
对于(变量i=0;iconsole.log(sortData(“col1”))对于分组,我将使用数组过滤器方法。如果希望在过滤后的数组中包含数组元素,则它接受一个应返回true的函数。因此,要获取col1为“id1”且col3为“12/01/12”的行,您可以执行以下操作:

var data = [{col1: 'id1', col2: '123', col3: '12/01/12'},
            {col1: 'id1', col2: '100', col3: '12/01/12'},
            {col1: 'id2', col2: '-100', col3: '12/01/12'},
            {col1: 'id2', col2: '123', col3: '13/01/12'}];

var grouped = data.filter(  function(row) {
                               return row.col3 == '12/01/12' && row.col1 == 'id1';
                            });
要对组中的列求和,可以使用Array reduce方法。它的第一个参数是一个“reduce”函数,该函数将数组中的元素缩减为单个值。它将起始值作为可选的第二个参数。reduce函数必须有两个参数。在第一次迭代中,第一个参数是指定的起始值,在后续迭代中,它是上一次迭代中函数的返回值。reduce函数的第二个参数是数组的一个元素。因此,要对分组数据的第二列求和,请执行以下操作:

var sumOfGrouped = grouped.reduce(function(sumSoFar, row) { return sumSoFar + parseInt(row.col2) }, 0);

看看其他的数组方法,你会发现其他对你有用的方法,这取决于你想做什么

我建议您查看一个名为lodash(下划线)的库。它有助于实现与数组相关的函数,这可能是Thank you的复制品-这完全符合我的期望,需要使其更通用,但非常确定这不会成为问题。我有一个关于reduce函数的问题,0的用途是什么,因为包含它会给我一个正确的求和,如果不包含它,我会打印出所有值,如:123100-100123。我阅读了文档,它说它是用来设置初始值的,但这似乎不能解释我的结果。再次感谢,0是还原结果的初始值。因此,在上面的示例中,在reduce的第一次迭代中,sumSoFar是0(指定为reduce的第二个参数),行被分组为[0]。在该迭代中,函数返回0+123=123,这将成为第二次迭代中sumSoFar的值,行=grouped[1]。在该迭代中,函数返回123+100=223,这是结果。如果省略零,那么在reduce的第一次迭代中,sumSoFar被分组为[0],row被分组为[1]。。。。。。当我删除零并按原样运行函数时,得到“[object]100”。这是因为函数返回sumSoFar+parseInt(row.col2)=grouped[0]+parseInt(grouped[1].col2]。grouped[0]是一个对象,但它被转换为字符串(“[object object object]”),并且+被视为字符串连接运算符。grouped[1]。因此,col2被转换回字符串并连接到“[object object]”“。如果您将函数更改为返回sumSoFar.col2+parseInt(row.col2),那么我希望得到您得到的结果,原因类似……sumSoFar.col2是一个字符串,因此javascript假定+是字符串连接运算符,“123”+100=“123100”。如果您将函数更改为返回parseInt(sumSoFar.col2)+parseInt(row.col2),则您将得到正确的结果,但前提是您使用的是2个值的数组。在这种情况下,reduce只运行一次迭代。如果您运行第二次迭代,则sumSoFar将成为一个整数,它没有col2属性。谢谢-这提供了一个有用的起点,我可能会将其与cjg b提供的解决方案一起使用ut提供了我需要的准确结果