Есть несколько способов подойти к этому:
Метод 1: Keep генерации случайного индекса до тех пор, пока не указует на пустое значение
var gameCase = ['', '', '', '', '', '', '', '', ''];
var randomIndex = Math.round(Math.random()*gameCase.length) % emptyCases.length;
var randomValue = gameCase[randomIndex];
// while we haven't found the empty value
while (randomValue !== '') {
// keep on looking
randomIndex = Math.round(Math.random()*gameCase.length % emptyCases.length);
randomValue = gameCase[randomIndex];
}
// when we exit the while loop:
// - randomValue would === ''
// - randomIndex would point to its position in gameCase[]
Метод 2: Есть 2-й массив, который держит трек которых индексы из массива gameCase
имеют пустые значения
var gameCase = ['', '', '', '', '', '', '', '', ''];
var emptyCases = [0,1,2,3,4,5,6,7,8];
if (emptyCases.length > 0) {
// generate random Index from emptyCases[]
var randomIndex = emptyCase[Math.round(Math.random()*emptyCase.length) % emptyCases.length];
// get the corresponding value
var randomValue = gameCase[randomIndex];
// remove index from emptyCases[]
emptyCases.splice(randomIndex, 1);
}
Метод № 2 более эффективен в некотором смысле, потому что у вас нет времени для создания/угадывания случайного индекса. Для метода № 1 вам нужен способ проверить , если в gameCase[]
есть пустые значения, иначе вы можете генерировать/угадывать навсегда в бесконечном цикле.
Подробнее: При установке значения gameCase[]
вам необходимо обновить emptyCases[]
соответствующим образом, чтобы точно отражать состояние gameCase[]
:
var gameCase = ['', '', '', '', '', '', '', '', ''];
var emptyCases = [0,1,2,3,4,5,6,7,8];
/* Update a value in gameCase[] at the specified index */
var setGameCaseValue = function(index, value) {
// set value for gameCase[]
gameCase[index] = value;
if (value !== '') { // we're setting a value
// remove that index from emptyCases[]
emptyCases.splice(emptyCases.indexOf(index), 1);
} else { // we're setting it back to empty string
// add that index into emptyCases[] that refers to the empty string in gameCase[]
emptyCases.push(index);
}
};
setGameCaseValue(2, 'null');
// gameCase now has ['','','null','','','','','','']
// emptyCases now has [0,1,3,4,5,6,7,8]
setGameCaseValue(0, 'null');
// gameCase now has ['null','','null','','','','','','']
// emptyCases now has [1,3,4,5,6,7,8]
setGameCaseValue(5, 'null');
// gameCase now has ['null','','null','','','null','','','']
// emptyCases now has [1,3,4,6,7,8]
setGameCaseValue(7, 'null');
// gameCase now has ['null','','null','','','null','','null','']
// emptyCases now has [1,3,4,6,8]
См скрипку: http://jsfiddle.net/rWvnW/1/
Итак, вы хотите случайных чисел с не повторяется значения. Верный? Таким образом, массив, такой как ['', '', ''], может быть ['1', '2', '3'], но не ['1', '1', '2'] – SwimBikeRun
У меня есть массив gameCase заполняется переменной. Каждый щелчок по элементу списка, массив получает другое значение. Поэтому мне нужно исключить этот новый ключ/значение, просто добавив в массив и создав новое случайное значение для добавления в этот массив. Странно объяснять. – jbr