Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用下划线或Lodash将行数组减少为汇总行_Javascript_Underscore.js_Lodash - Fatal编程技术网

Javascript 使用下划线或Lodash将行数组减少为汇总行

Javascript 使用下划线或Lodash将行数组减少为汇总行,javascript,underscore.js,lodash,Javascript,Underscore.js,Lodash,我有一个如下所示的行数组: [ { metric1: 50, metric2: 60 }, { metric1: 100, metric2: 120; } ] { metric1: 150, metric2: 180 } 我想把它简化成一行,如下所示: [ { metric1: 50, metric2: 60 }, { metric1: 100, metric2: 120; } ]

我有一个如下所示的行数组:

[
  { 
    metric1: 50,
    metric2: 60
  },
  {
    metric1: 100,
    metric2: 120;
  }
]
{
  metric1: 150,
  metric2: 180
}
我想把它简化成一行,如下所示:

[
  { 
    metric1: 50,
    metric2: 60
  },
  {
    metric1: 100,
    metric2: 120;
  }
]
{
  metric1: 150,
  metric2: 180
}
到目前为止,我有一个相当直接的方法:

_.reduce(function(row, aggregate) {
  _.each(row, function(value, metric) {
    aggregate[metric] = aggregate[metric] || 0;
    aggregate[metric] += value;
  });
  return aggregate;
}, {});

但我真的觉得用下划线或Lodash函数编程可以更简洁地实现这一点。有什么想法吗?

你可以用香草javascript干净利落地完成:

var result = data.reduce(function(totals, v) {
    totals.metric1 += v.metric1;
    totals.metric2 += v.metric2;
    return totals;
}, {metric1: 0, metric2: 0});
编辑:如果度量名称直到运行时才知道,那么您的解决方案可以正常工作。下面是另一个使用
的解决方案。merge

var result = _.merge.apply(null, [{}].concat(data).concat(function(total, v) {
  return (total || 0) + v;
}));
或者,如果您正在使用ES6:

var result = _.merge({}, ...data, (total=0, v) => {
  return total + v;
});

您可以使用香草javascript干净地完成此操作:

var result = data.reduce(function(totals, v) {
    totals.metric1 += v.metric1;
    totals.metric2 += v.metric2;
    return totals;
}, {metric1: 0, metric2: 0});
编辑:如果度量名称直到运行时才知道,那么您的解决方案可以正常工作。下面是另一个使用
的解决方案。merge

var result = _.merge.apply(null, [{}].concat(data).concat(function(total, v) {
  return (total || 0) + v;
}));
或者,如果您正在使用ES6:

var result = _.merge({}, ...data, (total=0, v) => {
  return total + v;
});

您可以使用香草javascript干净地完成此操作:

var result = data.reduce(function(totals, v) {
    totals.metric1 += v.metric1;
    totals.metric2 += v.metric2;
    return totals;
}, {metric1: 0, metric2: 0});
编辑:如果度量名称直到运行时才知道,那么您的解决方案可以正常工作。下面是另一个使用
的解决方案。merge

var result = _.merge.apply(null, [{}].concat(data).concat(function(total, v) {
  return (total || 0) + v;
}));
或者,如果您正在使用ES6:

var result = _.merge({}, ...data, (total=0, v) => {
  return total + v;
});

您可以使用香草javascript干净地完成此操作:

var result = data.reduce(function(totals, v) {
    totals.metric1 += v.metric1;
    totals.metric2 += v.metric2;
    return totals;
}, {metric1: 0, metric2: 0});
编辑:如果度量名称直到运行时才知道,那么您的解决方案可以正常工作。下面是另一个使用
的解决方案。merge

var result = _.merge.apply(null, [{}].concat(data).concat(function(total, v) {
  return (total || 0) + v;
}));
或者,如果您正在使用ES6:

var result = _.merge({}, ...data, (total=0, v) => {
  return total + v;
});


我确信
metric1
是未知的statically@zerkms我不太确定,但我想那是杰克林让我们知道的。我已经用另一种解决方案更新了我的答案。“我对此不太确定”-只要检查他们的代码。@zerkms代码没有说明密钥是否静态已知。他可能只是试图简化添加额外指标的过程。代码明确表示密钥未知。如果它们是已知的,并且确实如此,那么代码就不会有嵌套循环。我确信
metric1
是未知的statically@zerkms我不太确定,但我想那是杰克林让我们知道的。我已经用另一种解决方案更新了我的答案。“我对此不太确定”-只要检查他们的代码。@zerkms代码没有说明密钥是否静态已知。他可能只是试图简化添加额外指标的过程。代码明确表示密钥未知。如果它们是已知的,并且确实如此,那么代码就不会有嵌套循环。我确信
metric1
是未知的statically@zerkms我不太确定,但我想那是杰克林让我们知道的。我已经用另一种解决方案更新了我的答案。“我对此不太确定”-只要检查他们的代码。@zerkms代码没有说明密钥是否静态已知。他可能只是试图简化添加额外指标的过程。代码明确表示密钥未知。如果它们是已知的,并且确实如此,那么代码就不会有嵌套循环。我确信
metric1
是未知的statically@zerkms我不太确定,但我想那是杰克林让我们知道的。我已经用另一种解决方案更新了我的答案。“我对此不太确定”-只要检查他们的代码。@zerkms代码没有说明密钥是否静态已知。他可能只是试图简化添加额外指标的过程。代码明确表示密钥未知。如果它们是已知的,并且是这样的话,那么代码就不会有嵌套的循环。在我看来,你所得到的看起来非常干净,只是为了好玩现代ES:丑陋的想法你的数据是对象数组的格式。这是mxn的一个例子。您的解决方案可以修改为{.reduce(函数(行,聚合){.each(行,函数(值,度量){aggregate[metric]+=aggregate[metric]?value | | 0;});return aggregate;},{});在我看来,你所拥有的东西看起来相当干净,只是为了好玩:丑陋的想法你的数据是以对象数组的形式存在的。这是mxn的一个例子。您的解决方案可以修改为{.reduce(函数(行,聚合){.each(行,函数(值,度量){aggregate[metric]+=aggregate[metric]?value | | 0;});return aggregate;},{});在我看来,你所拥有的东西看起来相当干净,只是为了好玩:丑陋的想法你的数据是以对象数组的形式存在的。这是mxn的一个例子。您的解决方案可以修改为{.reduce(函数(行,聚合){.each(行,函数(值,度量){aggregate[metric]+=aggregate[metric]?value | | 0;});return aggregate;},{});在我看来,你所拥有的东西看起来相当干净,只是为了好玩:丑陋的想法你的数据是以对象数组的形式存在的。这是mxn的一个例子。您的解决方案可以修改为{.reduce(函数(行,聚合){.each(行,函数(值,度量){aggregate[metric]+=aggregate[metric]?value | | 0;});return aggregate;},{});