JavaScript arr.indexOf () всегда дает -1 - PullRequest
1 голос
/ 10 апреля 2020

У меня есть генератор случайных чисел и выбор одного из чисел внутри. Я пытаюсь получить позицию числа, поэтому я использовал index.of (), но он всегда показывает «-1». Я думал, что это будет самый прямой способ найти местоположение определенного числа в массиве. Я не прав?

const shuffle = arr => {
  let a = arr.slice(0); // take a copy
  for (let i = a.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [a[i], a[j]] = [a[j], a[i]];
  }
  return a;
};
var arr = [];
var UserNumber = 10;
var BallNumber = 4;
var RandomNumber = Math.floor(Math.random() * UserNumber) + 1;
while (arr.length < BallNumber) {
  var r = Math.floor(Math.random() * UserNumber) + 1;
  if (arr.indexOf(r) === -1) {
    arr.push(r);
  }
  console.log(r);
}
  var selected = shuffle(arr).slice(0, 1);
document.write("<p> The random Number to choose is " + selected + "</p>");
document.write("<p> The Random Numbers are " + arr + "</p>");
document.write("<p> The position is " + arr.indexOf(selected) + "</p>");

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Array.prototype.slice возвращает массив:

var selected = shuffle(arr).slice(0, 1)

Здесь selected теперь массив с одним элементом. Но объекты никогда не являются === для чего-либо, кроме самих себя, и поскольку indexOf использует === для определения признаков, он всегда будет возвращать -1.

Вместо этого извлекать первое значение из перетасованного массива:

var selected = shuffle(arr)[0]

const shuffle = arr => {
  let a = arr.slice(0); // take a copy
  for (let i = a.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [a[i], a[j]] = [a[j], a[i]];
  }
  return a;
};
var arr = [];
var UserNumber = 10;
var BallNumber = 4;
var RandomNumber = Math.floor(Math.random() * UserNumber) + 1;
while (arr.length < BallNumber) {
  var r = Math.floor(Math.random() * UserNumber) + 1;
  if (arr.indexOf(r) === -1) {
    arr.push(r);
  }
}
var selected = shuffle(arr).slice(0, 1)[0];
document.write("<p> The random Number to choose is " + selected + "</p>");
document.write("<p> The Random Numbers are " + arr + "</p>");
document.write("<p> The position is " + arr.indexOf(selected) + "</p>");
0 голосов
/ 10 апреля 2020

slice возвращает массив, поэтому вам нужно получить первый элемент, например:

const shuffle = (arr) => {
  let a = arr.slice(0); // take a copy
  for (let i = a.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [a[i], a[j]] = [a[j], a[i]];
  }
  return a;
};
var arr = [];
var UserNumber = 10;
var BallNumber = 4;
var RandomNumber = Math.floor(Math.random() * UserNumber) + 1;
while (arr.length < BallNumber) {
  var r = Math.floor(Math.random() * UserNumber) + 1;
  if (arr.indexOf(r) === -1) {
    arr.push(r);
  }
  console.log(r);
}
var selected = shuffle(arr).slice(0, 1);
document.write("<p> The random Number to choose is " + selected + "</p>");
document.write("<p> The Random Numbers are " + arr + "</p>");
document.write("<p> The position is " + arr.indexOf(selected[0]) + "</p>");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...