javascript 比较2个不同长度数组时出现未知问题

brjng4g3  于 2023-05-21  发布在  Java
关注(0)|答案(1)|浏览(166)

我试图比较一个较大的列/数组与一个较小的列/数组,看看较小的列值是否包含在较大的数组中。该脚本查看4个不同的列(支票编号和支票金额),并尝试找出行位置,其中:
C列中的支票号码不匹配
C中的支票号码匹配,但D列中的金额不相同
当数组进行比较,他们是完全相同的,只有1或2个手动更改正在进行的代码工作完美的罚款。但我需要检查cashedCheck表与OpenCheck表进行比较,并找到差异(如果有的话)。目前,C列中正确的支票号码从未被视为正确,它将CashedCheck表的整个长度视为无效(如在我的控制台日志中所见),我不确定我做错了什么。正如你在屏幕截图中看到的,两个表的值彼此非常不同,但有些值确实匹配,我试图找到哪些行在D列或C列中具有不同的值。

下面是代码

function CHK_BothChecks_V5_StackOverFlow() {
  const ss = SpreadsheetApp.getActive();
  const sh1 = ss.getSheetByName("OpenChecks");
  const sh2 = ss.getSheetByName("CashedChecks");
  var rg1 = sh1.getRange("C1:D" + sh1.getLastRow()).getValues();
  var rg2 = sh2.getRange("C1:D" + sh2.getLastRow()).getValues();
  var correctChecks = 0;
  var invalidChecks = 0;
  var invalidAmounts = 0; 
  for (var i = 0; i < rg2.length; i++) {  
    if (rg1[i][0] == rg2[i][0]) {
      correctChecks++;
    } 
    if(rg1[i][0] == rg2[i][0] && rg1[i][1] !== rg2[i][1]) {
      invalidAmounts++;
      var amtIndex = sh1.getRange(i + 1, 2).getRow();
      console.log("Incongruent amound found at row " + amtIndex);
    } if (rg1[i][0] !== rg2[i][0]) {
      var index = sh1.getRange(i + 1, 2).getRow();
      invalidChecks++;
      console.log(index); 
    }
  }
  console.log("Total number of valid check numbers is " + correctChecks);
  console.log("Total number of invalid check numbers is " + invalidChecks);
  console.log("Total number of invalid amounts is " + invalidAmounts);
}
ct3nt3jp

ct3nt3jp1#

您要将“已兑现”支票与“未兑现”支票进行匹配。

  • 如果校验号和值都匹配-则它是correctChecks
  • 如果校验号匹配但值不匹配,则它是invalidAmounts
  • 如果校验号不匹配,则为invalidChecks

OP的想法是正确的--循环检查,但检查在两个列表中的同一行上的可能性非常小。最好使用替代方法来查找匹配项。
解决方案使用indexOf

  • 在找到匹配项的位置,返回数组的索引号
  • 如果未找到匹配,则返回值“-1”。
function CHK_BothChecks_V5_StackOverFlow() {
  const ss = SpreadsheetApp.getActive();
  const sh1 = ss.getSheetByName("Open");
  const sh2 = ss.getSheetByName("Cashed");
  var rg1 = sh1.getRange("C1:D" + sh1.getLastRow()).getValues();
  var openChqNum = rg1.map(function(e){return e[0];})
  var rg2 = sh2.getRange("C1:D" + sh2.getLastRow()).getValues()
  var correctChecks = 0;
  var invalidChecks = 0;
  var invalidAmounts = 0; 
  // test all cashed cheques against open cheques
  for (var i = 0; i < rg2.length; i++) {
    var result = openChqNum.indexOf(rg2[i][0])
    //Logger.log("i="+i+", cashed chq# = "+rg2[i][0]+", result = "+result)
    if (result !== -1){
      // cheque number matches
      var cashedValue = rg2[i][1]
      var openValue = rg1[result][1]
      var proofValue = cashedValue-openValue
      if (proofValue == 0){
        // cheque value matches
        correctChecks++
        Logger.log("CORRECTCHQ: i="+i+", cashed chq# = "+rg2[i][0]+", cashed value = "+rg2[i][1]+", correct checks = "+correctChecks)
        //Logger.log(correctChecks) // DEBUG
      }
      else
      {
        // cheque value does not match
        invalidAmounts++
        Logger.log("INVALID AMOUNT: i="+i+", cashed chq# = "+rg2[i][0]+"cashed value = "+cashedValue+", open Value = "+openValue+" proof value = "+proofValue+", invalid Amounts = "+invalidAmounts)
        //Logger.log(invalidAmounts) // DEBUG
      }
    }else{
      // result = -1
      // no matching cheque
      invalidChecks++
      Logger.log("INVALID CHQ: i="+i+", cashed chq# = "+rg2[i][0]+", cashed value = "+cashedValue+", Invalid checks = "+invalidChecks)
      // Logger.log(invalidChecks) // DEBUG
    }
  }
  console.log("Total number of valid check numbers is " + correctChecks);
  console.log("Total number of invalid check numbers is " + invalidChecks);
  console.log("Total number of invalid amounts is " + invalidAmounts);
}

相关问题