Почему я не могу использовать массив как «указанное условие» через некоторое время l oop? - PullRequest
0 голосов
/ 18 апреля 2020

Итак, у меня есть этот код:

var myArray = [];

var value = 5;

while (myArray != [5, 4, 3, 2, 1, 0]) {

  myArray.push(value)

  value--;

  console.log(myArray);

}

, когда я смотрю на консоль, она продолжается бесконечно l oop, вот так ..

[ 5 ]
[ 5, 4 ]
[ 5, 4, 3 ]
[ 5, 4, 3, 2 ]
[ 5, 4, 3, 2, 1 ]
[ 5, 4, 3, 2, 1, 0 ]
[ 5, 4, 3, 2, 1, 0, -1 ]
[ 5, 4, 3, 2, 1, 0, -1, -2 ]
[ 5, 4, 3, 2, 1, 0, -1, -2, -3 ]

.. ........

Почему он не останавливается на [5,4,3,2,1,0]? myArray = что в точке и для l oop должно прекратиться no?

Извините за вопрос noob.

Ответы [ 3 ]

2 голосов
/ 18 апреля 2020

JavaScript не обеспечивает встроенную поддержку структурного равенства массивов, но реализовать компаратор просто:

function arraysEqual(a, b, orderSensitive = true) {
  // Function from https://stackoverflow.com/a/16436975/159145
  // But modified to add the `orderSensitive` option.

  if (a === b) return true;
  if (a == null || b == null) return false;
  if (a.length != b.length) return false;

  if (!orderSensitive) {
    a = Array.from(a).sort();
    b = Array.from(b).sort();
  }

  for (var i = 0; i < a.length; ++i) {
    if (a[i] !== b[i]) return false;
  }
  return true;
}

function yourCode() {
  var myArray = [];
  var value = 5;
  const finalArray = [5, 4, 3, 2, 1, 0];

  while (!arraysEqual(myArray,finalArray)) {
    myArray.push(value)
    value--;
    console.log(myArray);
  }
}
0 голосов
/ 18 апреля 2020

вы можете использовать следующий способ для устранения проблемы, если индекс и значения обоих массивов различны

while(sortArray(myArray).toString() !== sortArray([5, 4, 3, 2, 1, 0]).toString()) {
// your code
}

sortArray(array) {
  return array.filter((a, b) => a-b)
}

Если вы уверены, что индекс массива и значения для обоих массивов одинаковы, вы можете использовать

while(myArray.toString() !== [5, 4, 3, 2, 1, 0].toString()) {
// your code
}
0 голосов
/ 18 апреля 2020

@ Кристофер Баррето и добро пожаловать в StackOverflow. Удачи в вашем интересном вопросе.

, хотя @Dai прямо с его полным ответом гораздо проще построить преобразование массива в строку и затем сравнить их.

Это будет работать для вас :

var myArray = [];

var value = 5;

while (myArray.toString() != [5, 4, 3, 2, 1, 0].toString()) {

  myArray.push(value)

  value--;

  console.log(myArray);

}

Или это, если вы предпочитаете:

while ((''+myArray) != ('' + [5, 4, 3, 2, 1, 0]))
...