У вас есть смесь типов данных, назначенных массиву block. Когда пользователь вводит нечисловое значение, вы действительно назначаете вложенный массив одному из элементов block, но не так, когда пользователь вводит действительное число.
Из того, что я думаю, что вы делаете (игра в судоку?), это может иметь в виду: числа являются известными значениями в сетке, вложенные массивы представляют собой список значений, которые все еще возможны в этой конкретной ячейке.
Но затем во второй части вашего кода вы должны проверить, в каком из двух случаев вы находитесь, поскольку вы хотите удалить элементы массива только в том случае, если значение, на которое вы смотрите, действительно является массивом. Этот тест вы можете сделать с Array.isArray()
.
Есть также некоторые другие проблемы во второй части вашего скрипта:
- Выражение
block[a][b]
не соответствует тому, как вы заполнили этот массив: оно должно быть block[a*10+b]
, чтобы быть непротиворечивым.
b
в .indexOf(b)
неверно: вы ищете не это значение, а block[a*10+b]
.
splice()
всегда выполняется, даже если indexOf
возвращает -1
. Это приводит к нежелательному эффекту, так как если первый аргумент splice()
отрицательный, индекс действительно отсчитывается с конца массива, и все равно элемент из массива удаляется. Этого не должно происходить: вы должны выполнять splice
только в том случае, если результат indexOf
неотрицательный.
Ниже я разместил рабочую версию, но, чтобы избежать почти бесконечных подсказок, я предоставил этот фрагмент с текстовым полем, где вы можете ввести полную сетку 9x9 за один раз, а затем нажать кнопку, чтобы начать выполнение вашего кода. :
document.querySelector('button').onclick = function () {
var block = [];
var temp;
var del;
var text = document.querySelector('textarea').value.replace(/\s+/g, '');
for(var a = 0;a < 9;a++){
for(var b = 0;b < 9;b++){
temp = parseInt(text[a*9+b]); // <-- get char from text area
if(temp>0){
block[a*10+b] = temp;
}else{
block[a*10+b] = [1,2,3,4,5,6,7,8,9];
}
}
}
for(var a = 0;a < 9;a++){
for(var b = 0;b < 9;b++){
var num = block[a*10+b]; // <-- get content, fix the index issue
if(typeof num == "number"){
for(var c = 0;c < 9;c++){
if(c != b && Array.isArray(block[a*10+c])){ //<-- add array-test
del = block[a*10+c].indexOf(num); // <-- not b, but num
if (del > -1) // <-- only splice when found
block[a*10+c].splice(del,1);
}
}
}
}
}
document.querySelector('pre').textContent = 'block='+ JSON.stringify(block);
};
<textarea rows=9>
53..7....
6..195...
.98....6.
8...6...3
4..8.3..1
7...2...6
.6....28.
...419..5
....8..79
</textarea>
<button>Process</button>
<pre></pre>
Обратите внимание, что в block
есть элементы, которые остаются null
. Я полагаю, вы имели в виду это: когда вы умножаете a
на 10 и сохраняете только 9 значений в «строке», всегда остается один индекс, который остается нетронутым.
person
trincot
schedule
12.11.2016
console.log(block[((a * 10) + c)])
чтобы посмотреть, что это такое. Но, более конкретно, ошибка, которую вы получаете, указывает на то, что значение, вероятно, является объектом, а объекты не имеют методаindexOf
... Строки имеют, но у вас, вероятно, нет сохраненной строки. Кроме того, помните, что ВСЕ данные, возвращаемые изprompt
, возвращаются в виде строки. Даже если число было введено. - person Scott Marcus   schedule 12.11.2016typeof block[a][b] != "number"
. Но затем вы получаете доступ кblock[a*10+c]
. - person RobG   schedule 12.11.2016parseInt(prompt("....."));
на5
, и я не получил никаких ошибок. - person Motassem MK   schedule 13.11.2016