Array.splice не меняет длину

У меня есть функция, в которой я удаляю некоторые части массива, используя .splice, но когда я смотрю на console.log, его длина не изменилась... и с шестнадцатеричным дампом я также увидел, что "удаленная" строка все еще там

e.g.

Sudoku[j][y] = [3, 7]
Sudoku[x][y][k] = 3

function...
Sudoku[j][y].splice(Sudoku[j][y].indexOf(Sudoku[x][y][k]), 1)

console.log(Sudoku[j][y], Sudoku[j][y].length, Hexdump.dump(Sudoku[j][y]))
= [7] 2 /*Zusammenfassung des hex:*/ 3, 7

(значение, которое должно быть удалено, исходит из другой переменной, поэтому я написал часть с «indexOf»)

Судоку представляет собой трехмерную матрицу: первое D и второе D — это строки/столбцы x и y, а третье измерение — остальные возможности.

Что я могу сделать, чтобы удалить значение раз и навсегда?

потому что у меня есть ЕСЛИ, которому нужно знать длину моих массивов...

после того, как я добавил в свой код еще кучу console.log, я тоже видел это... Иногда...

console.log(sudoku[j][y].length, sudoku[j][y], sudoku[j][y].indexOf(sudoku[x][y][k]))
sudoku[j][y].splice(sudoku[j][y].indexOf(sudoku[x][y][k]), 1);
console.log(sudoku[j][y].length, sudoku[j][y])

Результат:

4 [7, 9] 0
3 [7, 9]

поэтому моей последней попыткой было использовать новый метод вместо сращивания:

sudoku[x][j][(sudoku[x][j].indexOf(sudoku[x][y][k]))]=sudoku[x][j][sudoku[x][j][sudoku[x][y].length-1]]
sudoku[x][j].length--

Это работало в jsfiddle, но не решило мои проблемы в моем реальном коде... иногда я видел "неопределенное" в своем коде... но большая проблема заключалась в том, что он также оставил там шестнадцатеричные дампы... так что длина, даже после того, как я прямо сказал ему стать меньше, не изменился...


person Robin93K    schedule 19.08.2013    source источник
comment
Работает здесь. Что такое Hexdump? Хм... Вы изменили свой массив с 1D на 2D...   -  person Teemu    schedule 19.08.2013
comment
На самом деле сейчас это 3D, и я думаю, что в Array.indexOf(3) есть опечатка...   -  person user1983983    schedule 19.08.2013
comment
Я изменил его, как будто это в моем коде...   -  person Robin93K    schedule 19.08.2013
comment
ссылка Не работает, когда я пишу свой код..   -  person Robin93K    schedule 19.08.2013
comment
hexdump должен показать значение как шестнадцатеричный код, закодированный и декодированный, он говорит, что судоку [j] [y] по-прежнему 3,7   -  person Robin93K    schedule 19.08.2013
comment
Когда вы ссылаетесь на jsFiddle, используйте ссылку вида jsfiddle.net/Badye/4 , т. е. путь только до номера версии.   -  person Teemu    schedule 19.08.2013
comment
Не понимаю, как длина массива может быть 4, но он регистрирует только 2 элемента. Какой браузер вы используете для этого?   -  person HMR    schedule 19.08.2013
comment
Я использую Firefox 21.0... И я тоже не совсем его понимаю... но похоже, что splice не удаляет значения, а просто делает их невидимыми. Пока вы не используете шестнадцатеричный дамп, вы можете увидеть их снова...   -  person Robin93K    schedule 19.08.2013


Ответы (1)


Вы соединяете элемент, который находится за пределами массива:

var arr = [1,2,3];
arr.splice(3,1);//doesn't take anything out of the array
arr.length===3;//true
person HMR    schedule 19.08.2013
comment
Sudoku[j][y].indexOf(Sudoku[x][y][k]) = 0, значит, это Sudoku[j][y].splice(0, 1), то, что определенно внутри - person Robin93K; 19.08.2013
comment
@Robin93K Вы уверены? Вы сделали это в console.log? Единственный способ, которым я могу заставить соединение ничего не делать, - это использовать число, равное или превышающее длину массива. - person HMR; 19.08.2013