Внутренний цикл не заполняет массив - PullRequest
0 голосов
/ 06 октября 2018

Может ли кто-нибудь объяснить, что мне не хватает в этом коде?

Разве цикл for не является асинхронным процессом?

Почему массив остается пустым?

var render = ["Element1","Element2","Element1","Element1","Element1"]

var exhaustive = []

for(var i=0;i<render.length;i++) {

   for(var j = 0;j<exhaustive.length;j++){

      if(!exhaustive[j]===render[i]){

          exhaustive.push(render[i])
      }
   }
}

console.log(exhaustive) // Expected result ["Element1","Element2"]

Ответы [ 4 ]

0 голосов
/ 06 октября 2018

Привет всем телам и спасибо за все эти ответы и реактивность.

Но я все еще не понимаю.

За тот факт, что циклам не хватает ширины для итерации, как объяснил НиколасЯ понял.

for (var j = 0; j < exhaustive.length; j++) {
    if (exhaustive[j] === render[i]) {
      found = true;
      break;
    }
  }

Не является ли перерыв действительно необходимым ни для чего, кроме ресурсов сохранения?

В строго логическом контексте в этом цикле

for(var j = 0;j<exhaustive.length;j++){

  if(!exhaustive[j]===render[i]){

      exhaustive.push(render[i])
  }

}

Для каждого элемента исчерпывающего, если и только если исчерпывающий не содержит render [i] push render [i]

Не понимаю, почему этот код добавляется более одного раза?

0 голосов
/ 06 октября 2018

Не работает по причине Николай объяснил .Похоже, вы просто пытаетесь отфильтровать уникальные значения из render в exhaustive.Попробуйте это ..

exhaustive = [...new Set(render)]
0 голосов
/ 06 октября 2018

Как уже говорили другие, внутренний цикл никогда не запускается, потому что exhaustive пусто.Но даже если он запустится, ваш код не будет работать правильно, потому что вы будете вызывать exhaustive.push() для каждого элемента в exhaustive, который отличается от render[i], но вы должны нажимать его только один раз.

Вам нужно нажать после цикла, если цикл не нашел совпадения.

var render = ["Element1", "Element2", "Element1", "Element1", "Element1"]

var exhaustive = []

for (var i = 0; i < render.length; i++) {
  var found = false;
  for (var j = 0; j < exhaustive.length; j++) {
    if (exhaustive[j] === render[i]) {
      found = true;
      break;
    }
  }
  if (!found) {
    exhaustive.push(render[i]);
  }
}

console.log(exhaustive) // Expected result ["Element1","Element2"]

Вы также можете использовать встроенный метод indexOf(), чтобы проверить, находится ли значение уже в массиве.

var render = ["Element1", "Element2", "Element1", "Element1", "Element1"]

var exhaustive = []

for (var i = 0; i < render.length; i++) {
  if (exhaustive.indexOf(render[i]) == -1) {
    exhaustive.push(render[i]);
  }
}

console.log(exhaustive) // Expected result ["Element1","Element2"]

Еще одна вещь: используйте if (x !== y) для проверки, если две вещи не равны, не if (!x === y)

0 голосов
/ 06 октября 2018

exhaustive.length равно 0.Если j = 0 и 0 < 0 ложно, то код в самом внутреннем цикле никогда не будет выполняться (условная часть цикла for должна быть истинной, чтобы выполнялся самый внутренний код).i просто зациклится, внутренний цикл j будет пропущен, а затем выйдет, ничего не сделав.Вы можете использовать операторы console.log внутри цикла, чтобы понять это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...