[英]Looking for matches in different arrays (Google Apps Script)
我在Google Apps脚本中有以下脚本:
for(var i=0; i<lastCode; i++) {
var productCode = prodCodesArr[i];
for(var j=0; j<kelliLastCode; j++) {
var kelliProductCode = kelliCodesArr[j];
if(productCode == kelliProductCode) {
Logger.log('match found')
}
}
}
2个数组是动态创建的。 所以这个想法是(而且我知道必须有更好的方法来实现这一点,但我对此很新,所以请耐心等待)我将i设置为一个数组中第一个产品代码的值然后循环另一个数组,同时将产品代码存储在这一个中。 现在,我尝试记录:
Logger.log(productCode + ' - ' + kelliProductCode);
这确实有效,并且确实存在productCode和kelliProduct代码匹配的情况。
然而我上面的if语句并没有提到这些。
再一次,我确信我已经完全拙劣,但任何帮助将不胜感激...
这样的事情可能会帮助你看到发生了什么:
function compareA(prodCodesArr,kelliCodesArr) {
var html="";
for(var i=0;i<prodCodesArr.length;i++) {
for(var j=0;j<kelliCodesArr.length;j++) {
if(productCodesArr[i]==kelliCodesArr[j]) {
html+=Utilities.formatString('Matched: %s=%s', productCodesArr[i],kelliCodesArr[j]);
}else{
html+=Utilities.formatString('No-Match: %s=%s', productCodesArr[i],kelliCodesArr[j]);
}
}
}
var userInterface=HtmlService.createHtmlOutput(html);
SpreadsheetApp.getUi().showModelessDialog(userInterface, 'Comparing')
}
检查有什么意义? 要确定哪些prodCodesArr
项目也在kelliCodesArr
? 为什么不解析kelliCodesArr
一次,然后使用哈希查找而不是数组遍历? 这意味着您不必使用嵌套的for
循环,随着内部循环大小的增加for
循环的扩展性会非常差。 一个例子(对我的假设进行了一些检查):
function foo() {
const kelliCodes = getKelliCodesArraySomehow();
const productCodes = getProductCodesArraySomehow();
// If these are 2D arrays, note that for `var a = ['help']; var b = ['help'];`
// `a` is never equal to `b` because they are not the exact same object in memory.
if (kelliCodes.length && Array.isArray(kelliCodes[0])) {
throw new TypeError("This SO answer was predicated on `kelliCodes` and `productCodes` being 1D arrays, but they aren't!");
}
const kelliLookup = kelliCodes.reduce(function (obj, kpc, idx) {
if (typeof kpc === 'object') {
console.log({message: "This SO answer assumed kpc was a string", kpc: kpc});
throw new TypeError("You probably want to store a property of this object, not the whole object");
}
obj[kpc] = idx;
return obj;
}, {});
var productsAlsoInKelliCodes = productCodes.filter(function (pc) {
return kelliLookup.hasOwnProperty(pc);
});
productsAlsoInKelliCodes.forEach(function (pc) {
Logger.log("The index of this product code %s in kelliCodes is %s", pc, kelliLookup[pc]);
});
}
如果___codes数组是2D数组,则应在比较之前将它们展平,因为将Array
实例与另一个Array
实例进行比较将始终返回false,即使它们包含相同的元素基元 - 它们不是完全相同的Array
实例:
参考
Array#forEach
Array#map
我相信还有更多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.