var a0 = new Array();
for (var i = 0; i < size.value; i++) {
var row = table.insertRow(i);
a0[i] = new Array();
for (var j = 0; j < size.value; j++) {
var input_matrix = document.createElement("input");
input_matrix.type = "text";
var cell = row.insertCell(j);
cell.appendChild(input_matrix);
a0[i][j] = input_matrix.value;
}
}
здравствуйте! пытаюсь сделать ввод матрицы с клавиатуры, но, когда вывожу этот массив в консоль, вижу только пустые строки в качестве элементов. подскажите, почему так? тем более input.value - это ж вроде всегда число, то есть строки никак не должно быть…
подскажите, пожалуйста, в чем проблема
PS. я конечно могу элементы ввести через один инпут и split объединит все в массив, но хочется разобраться и с таким вводом
Input.value всегда возвращает строку вне зависимости какое значение введено в инпут. Тебе нужно преобразовать строку в число с помощью parseFloat (для строк что описывают числа с плавающей точкой) или parseInt (для целых).
Судя по коду ты берёшь значения для матрицы прямо в момент создания инпутов. А в момент создания из значения - пустая строка. Наверное ты хочешь заполнить матрицу значениями после ввода пользователя, по нажатию кнопки.
да, я хочу заполнить матрицу по нажатию кнопки. что подскажете?
а по поводу того, что input.value всегда возвращает строку, могу немного поспорить. я пытался применять split к input.value (там находились числа через пробел), но мне результата это не давало. я долго думал, почему. наконец применил toString() и - вуаля - все заработало. это просто как факт. не буду ничего утверждать
Сратегий множество. Я бы сложил ссылки на инпуты в структуру похожую на матрицу, сохранил ее, а при клике пробегался бы по ней и из значений инпутов строил матрицу значений.
Плюс всякие детали: пустые и невалидные значения заменял бы на 0.
Вот реализация https://jsfiddle.net/4vksfch1/. Не ожидай что я продолжу давать готовые решения: обычно я помогаю разобраться с тем что у же есть.
function createMatrixInputs(node, width, height) {
var matrixInputs = []
for (var i = 0; i < height; i += 1) {
var row = node.insertRow()
var inputsRow = []
matrixInputs.push(inputsRow)
for (var j = 0; j < width; j += 1) {
var cell = row.insertCell()
var input = document.createElement('input')
inputsRow.push(input)
input.type = 'text'
input.style.width = '2em'
cell.appendChild(input)
}
}
return matrixInputs
}
function getMatrixValues(matrixInputs) {
var res = []
for (var i = 0; i < matrixInputs.length; i += 1) {
var inputsRow = matrixInputs[i]
var valuesRow = []
for (var j = 0; j < inputsRow.length; j += 1) {
var input = inputsRow[j]
var valueNum = parseFloat(input.value)
if (isNaN(valueNum)) { // те строковые значения, которые не смог распарсить в число заменяю на 0
valueNum = 0
}
valuesRow.push(valueNum)
}
res.push(valuesRow)
}
return res
}
// Само приложение
var submitButton = document.querySelector('button')
var matrixInputs = createMatrixInputs(document.querySelector('.matrix-inputs'), 10, 6)
submitButton.addEventListener('click', function() {
var matrix = getMatrixValues(matrixInputs)
console.log('matrix', matrix)
}, false)
хорошо, спасибо, я понял приблизительно твою идею. применю в своем решении
насчет кода.
var val = matrix.value;
var str = val.toString().split(" ");
этот код у меня не работал, пока я не перевел значение в строку. писал эту программу (это всего лишь часть кода, естественно) давненько. хотя сейчас убрал перевод, все вроде бы работает