#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)