简体   繁体   English

Google Apps 脚本:比较数组的唯一值

[英]Google Apps Script: Comparing Arrays for Unique Values

I'm working from the solution provided HERE to compare two arrays.我正在使用此处提供的解决方案来比较两个数组。 The example provided returns values found in both arrays to Array1 ( same ) and values only found on one or the other two Array2 ( diff ).提供的示例将在两个数组中找到的值返回给 Array1( same ),并将仅在一个或其他两个 Array2 上找到的值( diff )返回。

ISSUE: When I apply it to my own script, valuesDATA returns nothing and valuesCheckSeeding returns ALL values from both arrays问题:当我将它应用于我自己的脚本时, valuesDATA返回任何内容, valuesCheckSeeding返回两个数组中的所有值

DESIRED RESULT: I have two arrays that I'd either like to create a third out of, or only select values from the first array, valuesDATA which are NOT present in the second, valuesCheckSeeding .期望的结果:我有两个阵列,我会要么喜欢创建第三出来的,或仅选择从所述第一阵列,值valuesDATA其不存在于第二, valuesCheckSeeding Using the solution above, I was trying to have all values not found in valuesCheckSeeding AND valuesDATA pushed to valuesDATA .使用上面的解决方案,我试图将valuesCheckSeedingvaluesDATA未找到的所有值推送到valuesDATA

SAMPLE OF valuesDATA : "U09 F Harford FC Hill/Healey - A MD CMSA Girls Saturday U09 A/B North Premier - Top TID0118" valuesDATA “U09 F Harford FC Hill/Healey - A MD CMSA Girls 周六 U09 A/B North Premier - Top TID0118”

What am I doing wrong?我究竟做错了什么? I tinkered with changing matchfound==false and matchfound=true in the loop, but that still didn't give me the desired result.我在循环中修改了matchfound==falsematchfound=true ,但这仍然没有给我想要的结果。

MOST RELEVANT SNIPPET最相关的片段

var matchfound = false;

for (var i = 0; i < valuesDATA.length; i++) {
  matchfound=false;
    for (var j = 0; j < valuesCheckSeeding.length; j++) {
      if (valuesDATA[i] == valuesCheckSeeding[j]) {
        valuesCheckSeeding.splice(j, 1);
        matchfound=true;
        continue;
        }
        }
          if (matchfound==false) {
            valuesCheckSeeding.push(valuesDATA[i]);
            valuesDATA.splice(i, 1);
            i=i-1;
            }
          }

WORKIG SCRIPT EDITED FROM COMMENTS/ANSWERS BELOW从下面的评论/答案编辑的工作脚本

//UPDATE SEEDING SHEET
function updateSeedingSheet() {

var today = Utilities.formatDate(new Date(),Session.getScriptTimeZone(), "MM/dd/yyyy hh:mm a");   

//INPUT SHEET INFO
var inputCurrentRow = 4;
var inputCurrentColumn = 20;
var inputNumRows = 1000;
var inputNumColumns =1;

var ssInput = SpreadsheetApp.openById('1Wzg2BklQb6sOZzeC0OEvQ7s7gIQ07sXygEtC0CSGOh4');
var sheetDATA = ssInput.getSheetByName('DATAREF');
var rangeDATA = sheetDATA.getRange(inputCurrentRow, inputCurrentColumn, inputNumRows, inputNumColumns);
var valuesDATA = rangeDATA.getValues();


//SEEDING SHEET INFO
var seedingCurrentRow = 4;
var seedingCurrentColumn = 1;
var seedingNumRows = 1000;
var seedingNumColumns = 1;

var ssSeeding = SpreadsheetApp.openById('1DuCHeZ3zba-nHq-7vYTrylncPGqcA1J9jNyW9DaS3mU');
var sheetSeeding = ssSeeding.getSheetByName('Seeding');
var rangeCheckSeeding = sheetSeeding.getRange(4, 102, 1000, 1);
var columnToClear = sheetSeeding.getRange(seedingCurrentRow, seedingCurrentColumn, seedingNumRows, seedingNumColumns);
var valuesCheckSeeding = rangeCheckSeeding.getValues();


//METHOD TO FILTER
valuesCheckSeeding = valuesCheckSeeding.map(function(e){return e[0];}); //flatten this array
var filteredArr = valuesDATA.filter(function(e){
    return !(this.indexOf(e[0])+1);
},valuesCheckSeeding);
Logger.log(filteredArr);
Logger.log(filteredArr.length);

var rangeSeeding = sheetSeeding.getRange(seedingCurrentRow, seedingCurrentColumn, filteredArr.length, seedingNumColumns);

sheetSeeding.getRange('A1').setValue(today);
columnToClear.clearContent();
rangeSeeding.setValues(filteredArr);



/*
//ALTERNATIVE METHOD USING LOOPS
for (var i = 0; i < valuesDATA.length; i++) {
    for (var j = 0; j < valuesCheckSeeding.length; j++) {
      if (valuesDATA[i][0] == valuesCheckSeeding[j][0]) {
        valuesDATA.splice(i, 1);
        i--; //account for the splice
        break; //go to next i iteration of loop
          }
       }
     }
          Logger.log("VALUES DATA:" + valuesDATA);
          Logger.log("VALUES CHECK SEEDING: " + valuesCheckSeeding);         

//sheetSeeding.getRange('A1').setValue(today);
//rangeSeeding.clearContent();
//rangeSeeding.setValues(valuesDATA); //INCORRECT RANGE HEIGHT, WAS 71 BUT SHOULD BE 1000 - Is splice affecting this? 

*/

}//END FUNCTION

V8(ES2016 update): V8(ES2016 更新):

  • You can use newer and efficient set class您可以使用更新和高效的集合

 const array1 = [[1],[2],[3]], array2 = [[1],[3],[4]], set = new Set(array2.flat()) console.info(array1.filter(e => !set.has(e[0]))) //expected output [[2]]


  • You're checking a 2D array.您正在检查二维数组。 You'd need to use [i][0] and [j][0]你需要使用[i][0][j][0]
  • You can try only splicing valuesDATA你可以尝试只拼接valuesDATA

Try尝试

for (var i = 0; i < valuesDATA.length; i++) {
    for (var j = 0; j < valuesCheckSeeding.length; j++) {
      if (valuesDATA[i][0] == valuesCheckSeeding[j][0]) {
        valuesDATA.splice(i, 1);
        i--; //account for the splice
        break; //go to next i iteration of loop
        }
     }
}
Logger.log(valuesDATA);

Alternatively, try或者,尝试

valuesCheckSeeding = valuesCheckSeeding.map(function(e){return e[0];}); //flatten this array
var filteredArr = valuesDATA.filter(function(e){
    return !(this.indexOf(e[0])+1);
},valuesCheckSeeding);
Logger.log(filteredArr);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM