Оператор IF срабатывает беспорядочно при сравнении элементов двух массивов - PullRequest
0 голосов
/ 07 июня 2019

***** ИЗМЕНЕНО ДЛЯ ВКЛЮЧЕНИЯ ИСТИНА МИНИМАЛЬНЫЙ ВОСПРОИЗВОДИМЫЙ ПРИМЕР *****

У меня есть вложенный цикл for, который читает элементы из массива и записывает в другоймассив.Внутренний цикл for должен проверять элементы в одном из массивов и break возвращаться во внешний массив, когда элементы не равны.

Я сослался на stackoverflow для всех связанных вопросов, чтобы попытаться найтирешение.Я попытался записать элементы массива в переменные и сравнить их, но результат тот же;if условие срабатывает беспорядочно, и я не могу определить, что это за шаблон.

Я использовал Logger.log в моих условиях тестирования и мне удалось точно определить оператор for, который вызывает проблемы -но я не смог найти решение.

function importCollection() {
  var xpacs = [[1], [1], [1], [1], [1], [1], [2], [2], [3], [3], [3]];
  var cards = [[1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11]];

  var cards0 = [];
  var cards1 = [];
  var cards2 = [];
  var cards3 = [];
  var cards4 = [];

  var a = 0;
  var b = 0;
  var c = 0;
  var x = 0;
  var y = 11;

  for (b;c<y;b++) {
    x = xpacs[c];
//    Logger.log("x: "+x)
//    Logger.log("xpacs: "+xpacs[c]);
    PACK_LOOP: for (var a=0;a<5;a++) {
      if (c==y || x!=xpacs[c]) {  //  ***** ERROR - This is the code that is triggering too often
        Logger.log("Row: "+b);
        Logger.log("Col: "+a);
        Logger.log("Card: "+c);
        Logger.log(x);
        Logger.log(xpacs[c]);
        Logger.log("This if statement shouldn't be triggering when the two lines above are equal!");
        break PACK_LOOP
      }
      eval("cards"+[a]+"[b] = cards[c]");
      c++;
    }
  }
  Logger.log(cards0);
  Logger.log(cards1);
  Logger.log(cards2);
  Logger.log(cards3);
  Logger.log(cards4);
}

Ожидаемые результаты должны быть:

[[1.0], [6.0], [7.0], [9.0]]
[[2.0], null,  [8.0], [10.0]]
[[3.0], null,  null,  [11.0]]
[[4.0], null,  null,  null]
[[5.0], null,  null,  null]

Спасибо всем за помощь

1 Ответ

1 голос
/ 08 июня 2019

Выражение, сравнивающее Объекты, истинно, только если операнды ссылаются на один и тот же Объект

Массив является объектом.Когда вы сравниваете два объекта, они всегда будут ложными.На данный момент,

if (c==y || x!=xpacs[c])

Если x и xpacs [c] равны [1.0] и [1.0] соответственно, так как вы сравниваете оба объекта,

[1.0] === [1.0] //false both objects don't refer the same object in memory
[1.0] !== [1.0] //true both objects don't refer the same object in memory
[1.0][0] === [1.0][0] //true as 1 === 1

Вам необходимосравнить значения примитивов: (строки, числа, логические):

if (c==y || x[0]!=xpacs[c][0])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...