получить список отключенных кнопок index

#javascript

#javascript

Вопрос:

Я создал массив b для хранения девяти кнопок, а массив c из чисел от 0 до 9 представляет местоположение кнопки. Что я хочу сделать, так это то, что каждый раз, когда я нажимаю кнопку, кнопка становится отключенной, а массив c также удаляет номер этой кнопки. Пример: когда я нажимаю button1, button2, button7, массив c станет [2,3,4,5,7,8] или если я нажму кнопку 9, кнопку 5, кнопку 3, c станет [0,1,3,5,6,7]. Часть кнопки работает хорошо, и я изо всех сил пытаюсь изменить массив c.

Мой код до сих пор, и я не помещаю здесь функцию нажатия кнопки:

 let b =[bt1,bt2,bt3,bt4,bt5,bt6,bt7,bt8,bt9]
let c = [0,1,2,3,4,5,6,7,8]
function search(array) {
  for(let i = 0; i < array.length; i  ) {
    if(b[i].disabled == true) {
// do something
    }
  }
}
//everytime click a button, the buttoon will be disabled and the c will change
search(c)
console.log(c)
  

Я пытался использовать splice, но длина c была изменена, и результат не был хорошим

Комментарии:

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

2. Я хочу создать минимаксный алгоритм ai для игры в крестики-нолики, и я хотел использовать метод, описанный выше, чтобы получить доступные места для ai для выполнения алгоритма. сначала я попытался c.splice(i,1) заменить` //do something part ` в моем коде. Консоль показывает, что длина c также изменилась, когда я нажал кнопку, поэтому я не могу удалить элемент в нужном месте.

3. попробуйте это c = [0,1,2,3,4,5,6,7,8,9] var pos = 6 // означает, что вы хотите удалить номер 7 в массиве/// var NewArray = c.slice(0,pos).concat(c.slice(pos 1))

Ответ №1:

Я предпочитаю, чтобы вы добавляли индекс узлов, которые не отключены, в массив, а не выводили отключенный узел.

 let b =[bt1,bt2,bt3,bt4,bt5,bt6,bt7,bt8,bt9]
// let c = [0,1,2,3,4,5,6,7,8];
function search(array) {
  let c = [];
  for(let i = 0; i < array.length; i  ) {
    if(b[i].disabled == true) {
      // do nothing
    } else {
      // push that to array
      c.push(i);
    }
  }
}
//everytime click a button, the buttoon will be disabled and the c will change
search(c)
console.log(c)
  

Комментарии:

1. большое спасибо, я буду работать над этим сейчас, и я дам вам знать, работает ли это в моем коде!

Ответ №2:

одним из подходов может быть создание нового массива, нажатие всех допустимых кнопок там и возврат нового массива.

 let b =[bt1,bt2,bt3,bt4,bt5,bt6,bt7,bt8,bt9]
let c = [0,1,2,3,4,5,6,7,8]
function search(array) {
  let newC = [];
  for(let i = 0; i < array.length; i  ) {
    if(!b[i].disabled) {
      newC.push[i];
    }
  }
  return newC;
}
//everytime click a button, the buttoon will be disabled and the c will change
c = search(c)
console.log(c)
  

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

 let b =[bt1,bt2,bt3,bt4,bt5,bt6,bt7,bt8,bt9]
let c = [0,1,2,3,4,5,6,7,8]

function copy1DArray(array){
  let newArray = [];
  for(let i=0;i<array.length;i  ){
    newArray.push(array[i]);
  }
  return newArray;
}

function search(array) {
  copiedArray = copy1DArray(array);
  for(let i = 0; i < copiedArray.length; i  ) {
    if(b[i].disabled) {
      array.splice(i,1);
    }
  }
}
//everytime click a button, the buttoon will be disabled and the c will change
search(c)
console.log(c)
  

Объекты Javascript являются ссылочными типами, вы никогда не должны использовать операторы типа splice для них в цикле. Всегда лучше брать копию массива в качестве ссылки. Здесь копия должна быть глубокой копией. Функция копирования, которую я написал здесь, не выполняет глубокое копирование, но она будет работать в этом случае.

Комментарии:

1. спасибо за ваши усилия по моему вопросу. Я работаю над этим!

2. Это работает! Я использую первый метод, который вы дали. но мне нужно объявить массив при вызове функции. В противном случае длина c также изменится, и индекс будет испорчен. Мой код: let d = search(c); console.log(d)