javascript - Google Apps 脚本:比较数组的唯一值
问题描述
我正在使用此处提供的解决方案来比较两个数组。提供的示例将在两个数组中找到的值返回给 Array1 ( same
),并将仅在一个或另外两个 Array2 ( diff
) 上找到的值返回。
ISSUE:当我将它应用到我自己的脚本时,valuesDATA
什么都不返回并valuesCheckSeeding
返回两个数组中的所有值
期望的结果:我有两个数组,我想从中创建第三个数组,或者只从第一个数组中选择第二个数组valuesDATA
中不存在的值,valuesCheckSeeding
. 使用上面的解决方案,我试图将valuesCheckSeeding
AND中未找到的所有值valuesDATA
推送到valuesDATA
.
示例valuesDATA
: “U09 F Harford FC Hill/Healey - A MD CMSA Girls Saturday U09 A/B North Premier - Top TID0118”
我究竟做错了什么?我在循环中修改matchfound==false
和修改matchfound=true
,但这仍然没有给我想要的结果。
最相关的片段
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 脚本
//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 更新):
- 您可以使用更新和高效的集合 类
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]]
- 您正在检查二维数组。你需要使用
[i][0]
和[j][0]
- 你可以尝试只拼接
valuesDATA
尝试
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);
或者,尝试
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);
推荐阅读
- angular - 离子显示 {{ data.name }} 仅在数据可用后(来自 HTTP)
- javascript - 当 onPaste 在 contenteditable div 内时,新行将变成空 div,例如, 代替
- c# - 企业库 6 登录到数据库和电子邮件在服务器上不起作用
- python - 在 windows 10 中使用 python 3.7 导入 tensorflow 时出错
- node.js - 获取标头响应 Nuxt Axios
- python - 如何在曲线旁边显示最后一个 Y 轴值?
- angular - 与子组件的角度 ChangeDetectionStategy.OnPush 应用程序混淆
- r - 如何更改 IDE RStudio 的语言?
- keras - 关于迁移学习中不可训练的层数
- python - 修改 Bokeh 中悬停时的显示格式