Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.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 比较数组中的值计算它们并合并表中的行_Javascript_Jquery_Arrays_Angularjs - Fatal编程技术网

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

Javascript 比较数组中的值计算它们并合并表中的行,javascript,jquery,arrays,angularjs,Javascript,Jquery,Arrays,Angularjs,“我的代码”中有一个搜索字段,用户可以在其中搜索关于另一个id为的用户的信息。搜索完成后,系统将返回$scope.mixedList数组。这是动态数组,输出可以不同 我需要的是检查: if(cat_id == previous_cat_id && process_id == previous_process_id){ summarize output; summarize achievement; merge rows in table; }else{ outpu

“我的代码”中有一个搜索字段,用户可以在其中搜索关于另一个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;
    }
  }
}

第二个数组不必合并,因为
cat\u id
process\u 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 },
];


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

代码中的问题是
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;
      }
    }
  }
}
函数计算类别(列表){
var cache=newmap();
如果(list.length>0){
列表[0]。OutAchCatRowMatch=false;
var-merge=false;
对于(变量i=0;i
是否最多需要合并两行(我怀疑您的解决方案是否适用于合并三行)?如果顺序不同会发生什么?@Taleeb我有类似的合并功能,而且似乎可以处理不同数量的行,所以我认为合并不会有问题。唯一的问题是计算错误。它是按流程订购的,因此订单将是same@YevgeniyBagackiy解决这个问题最简单的方法是清楚地显示输入和输出数组。你能准备两个数组吗?一个有输入,另一个有预期的输出?
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;
      }
    }
  }
}