比较数组中的值计算它们并合并表中的行

Posted

技术标签:

【中文标题】比较数组中的值计算它们并合并表中的行【英文标题】:Compare values inside an array calculate them and merge rows in the table 【发布时间】:2019-11-04 21:22:19 【问题描述】:

我的代码中有一个搜索字段,用户可以在其中搜索有关具有 id 的另一个用户的信息。搜索完成后系统将返回$scope.mixedList 数组。这是动态数组,输出可以不同。

我需要检查:

if(cat_id == previous_cat_id && process_id == previous_process_id)
  summarize output;
  summarize achievement;
  merge rows in table;
else
  output = output;
  achievement = achievement;
  do not merge rows in table;

为此,我创建了一个函数calculateCategory

var cat_output = 0;
var cat_achievement = 0;
function calculateCategory(list) 
  if (list.length > 0) 
    list[0].OutAchCatRowMatch=false;
    for (var i = 0; i < list.length; i++) 
      var process_id = list[i].process_id;
      var cat_id = list[i].cat_id;
      var output = list[i].output;
      var achievement = list[i].achievement;

      var outp_rows = 1;
      for (var j = i + 1; j < list.length; j++) 
        if (process_id === list[j].process_id && cat_id === list[j].cat_id) 
          outp_rows++;
          cat_output = parseFloat(list[j].output) + parseFloat(output);
          cat_achievement = parseFloat(list[j].achievement) + parseFloat(achievement);
          list[j].OutAchCatRowMatch=true;
        else              
          cat_output = parseFloat(list[j].output);
          cat_achievement = parseFloat(list[j].achievement);  
          list[j].OutAchCatRowMatch=false;
          break;
        
      
      list[i].cat_output = cat_output;
      list[i].cat_achievement = cat_achievement;
      list[i].outp_rows = outp_rows;
    
  

这里是数组输出和html表格输出的两个例子:

第一个结果应该是合并的行,并且第一个合并的行不正确:

$scope.mixedList = [
     pcode: "ENC2", cat_id: "5", process_id: "4", output: "102", achievement: 33.55 ,
     pcode: "LMA", cat_id: "5", process_id: "4", output: "11", achievement: 3.62 ,
     pcode: "ENC2", cat_id: "5", process_id: "3", output: "92", achievement: 28.22 ,
     pcode: "LMA", cat_id: "5", process_id: "3", output: "11", achievement: 3.37 ,
];

第二个数组不必合并,因为cat_idprocess_id 不同。这里只是一团糟:

$scope.mixedList = [
     pcode: "LMA KEY", cat_id: "7", process_id: "5", output: "5.13", achievement: 1.95 ,
     pcode: "TFY", cat_id: "8", process_id: "5", output: "50.64", achievement: 21.28 ,
     pcode: "LMA INB", cat_id: "7", process_id: "6", output: "5.13", achievement: 1.91 ,
];

我的功能有什么问题?如何更改它以使其正常工作?

【问题讨论】:

是否最多需要合并两行(我怀疑您的解决方案是否适用于合并三行)?如果顺序不同,还会发生什么? @Taleeb 我有类似的合并功能,并且似乎可以很好地处理不同数量的行,所以我认为合并不会有问题。唯一的问题是错误的计算。它是按流程排序的,所以顺序是一样的 @YevgeniyBagackiy 解决这个问题的最简单方法是清楚地显示输入和输出数组。你能准备两个数组吗?一个有输入,另一个有预期的输出? 【参考方案1】:

代码中的问题是else 语句。如果合并发生与否,它的行为需要有所不同。

我修改了代码以使用下面的Map 函数(根据我对您的代码的理解)来缓存计算的数据,然后改用它。如果有帮助,请告诉我。

function calculateCategory(list) 
  var cache = new Map();
  if (list.length > 0) 
    list[0].OutAchCatRowMatch = false;
    var merge = false;
    for (var i = 0; i < list.length; i++) 
      var process_id = list[i].process_id;
      var cat_id = list[i].cat_id;
      var cat_output = list[i].output;
      var cat_achievement = list[i].achievement;
      var outp_rows = 1;

      var key = list[i].process_id + ":" + list[i].cat_id;
      if (cache.has(key)) 
        var cachedValues = cache.get(key);
        list[i].cat_output = cachedValues.cat_output;
        list[i].cat_achievement = cachedValues.cat_achievement;
        list[i].outp_rows = cachedValues.outp_rows;
       else 
        for (var j = i + 1; j < list.length; j++) 
          if (process_id === list[j].process_id && cat_id === list[j].cat_id) 
            outp_rows++;
            cat_output = parseFloat(list[j].output) + parseFloat(cat_output);
            cat_achievement = parseFloat(list[j].achievement) + parseFloat(cat_achievement);
            list[j].OutAchCatRowMatch = true;
          
        
        cache.set(key, 
          "cat_output": cat_output,
          "cat_achievement": cat_achievement,
          "outp_rows": outp_rows
        );
        list[i].cat_output = cat_output;
        list[i].cat_achievement = cat_achievement;
        list[i].outp_rows = outp_rows;
      
    
  

【讨论】:

以上是关于比较数组中的值计算它们并合并表中的行的主要内容,如果未能解决你的问题,请参考以下文章

在添加Flask,SQLAlchemy之前检查表中的行中的值是不是已经存在

比较 2 个表中的值并生成具有差异的新表

在 NumPy 数组的行中的特定位置插入零行

计算行中的值也在前一行中的行

协助表格添加行中的值并使用按钮删除它们。使用 jQuery

如何将一个表中的行合并到另一个表中的另一行