Код не выполняет условие else в самом внутреннем цикле при сопоставлении массива с индексом массива по индексу? - PullRequest
0 голосов
/ 11 сентября 2018
  var amazon = activeSpreadsheet.getSheetByName('Amazon');
  var lastRow1 = amazon.getLastRow();
  var array1 = amazon.getRange('A2:A' + lastRow1).getValues();

  var source = activeSpreadsheet.getSheetByName('ProductDetails');
  var lastRow2 = source.getLastRow();
  var array2 = source.getRange('B2:B' + lastRow2).getValues();

  n = 2;
  x = 0; // match
  z = 0; // non-match

  for (var i = 0; i < array2.length; i++){
    for (var j = 0; j < array1.length; j++){

      if (array2[i] !== array1[j]){
        z = z + 1;
      }
      else {
        x = 9999
      }
    }
    newsheet.getRange([n],[5]).setValue(z);
    newsheet.getRange([n],[6]).setValue(x);
    if (z > x) {
      newsheet.getRange([n],[1]).setValue(array2[i]);
      n == n++;
      z = 0;
      x = 0;
      }
    else if (z < x) {
      z = 0;
      x = 0;
    }
}

Мой проект написан на GAS (скрипты приложения Google), который, по сути, для всех целей и задач JS с вариациями в библиотеках.

В основном я беру элемент в массиве 2 и пропускаю его через цикл, чтобы он соответствовал массиву1. Каждый раз, когда он не совпадает, он добавляет 1, а когда он совпадает (должен совпадать только один раз, если у него есть совпадения), он сохраняет произвольное большое число (больше длины array1) и сравнивает их.

Как видите, я выписал для отображения этих значений, и я всегда получаю z = 5183 (длина массива1) и x = 0 (что означает, что несоответствия не найдены). Поэтому, даже если что-то существует в массивах 2 и 1, оно всегда записывает это в ячейку.

Что должно произойти, если есть совпадение, z = 5182 и x = 9999 (или произвольно большое число), а с 5182 <9999 ничего не происходит. </p>

Является ли моя сфера неправильной? Или я неправильно пишу If / Else? Или что-то еще?

1 Ответ

0 голосов
/ 11 сентября 2018

Ваш код выполняет строгое сравнение элементов двух Array с. Это нормально, в общем. Однако для этих конкретных Array s эти элементы также Array s, что означает, что строгое (не) равенство проверяет, чтобы увидеть, являются ли они точно такими же объектами массива в памяти. См. этот вопрос для получения дополнительной информации.

Вы, вероятно, хотели выполнить сравнение на основе значений, что означает, что вам нужно сравнить конкретный элемент этого внутреннего массива (то есть, снова индексировать). if (array2[i][0] !== array1[j][0]) {...} проверит 1-й элемент внутреннего массива.

Глядя на создание экземпляров array1 и array2, мы видим, что это действительно 2D-массивы из одного столбца Range s, поэтому в каждом внутреннем будет только 1 элемент массив. Вы можете уменьшить необходимый уровень индексации, сгладив эти массивы при их чтении:

const array1 = sheet.getRange(...).getValues().map(function (row) { return row[0]; });
const array2 = ...;

Я также не уверен, почему вы передаете массивы Sheet#getRange - вы должны передать 1-4 аргумента в соответствии с сигнатурами метода , подробно описанными в документации по скрипту приложения .

Обратите внимание, что есть намного лучшие алгоритмы для проверки, существует ли значение в данном массиве - вы повторно сканируете весь 2-й массив для каждого значения первого массива. Вам следует тщательно изучить эту тему, прежде чем задавать новый вопрос о том, как улучшить ваш алгоритм.

Наконец, вы должны реализовать лучший метод использования пакетных методов - вы в настоящее время вызываете setValue в цикле. Подумайте о том, чтобы сохранить результаты для записи в массив, а затем записать с Range#setValues после завершения цикла. На эту тему вы можете ознакомиться с большим количеством вопросов.

...