Поиск совпадений в разных массивах (Google Apps Script) - PullRequest
0 голосов
/ 22 марта 2019

У меня есть следующий скрипт в Google Apps Script:

 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 значение первого кода продукта в одном массиве, а затем перебираю другой массив при сохранении кодов продуктов в этом к j. Теперь я попытался войти:

Logger.log(productCode + ' - ' + kelliProductCode);

И это сработало, и действительно, были случаи, когда код productCode и kelliProduct совпал.

Тем не менее, мое утверждение if выше не подхватывает их.

Опять же, я уверен, что я испортил это целиком, но любая помощь будет принята с благодарностью ...

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Какой смысл проверки? Чтобы определить, какие из ваших prodCodesArr предметов также находятся в kelliCodesArr? Почему бы не проанализировать kelliCodesArr только один раз, а затем использовать поиск по хешу вместо обхода массива? Это будет означать, что вам не нужно использовать вложенные циклы 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]);
  });
}

Если ваши массивы ___-кодов являются 2D-массивами, вы должны сгладить их перед сравнением, так как сравнение экземпляра Array с другим экземпляром Array всегда будет возвращать false, даже если они содержат одинаковые примитивы элемента - они не являются точно такой же Array экземпляр:

Ссылки

Я уверен, что есть еще.

0 голосов
/ 22 марта 2019

Примерно так может помочь вам увидеть, что происходит:

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')
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...