#javascript
#javascript
Вопрос:
Как я могу создать массив объектов из тела HTML-таблицы? Вот как выглядит мой HTML-код
<tbody id="metadata">
<tr>
<td><input type="numeric" /></td>
<td><input type="numeric" /></td>
</tr>
<tr>
<td><input type="numeric" /></td>
<td><input type="numeric" /></td>
</tr>
<tr>
<td><input type="numeric" /></td>
<td><input type="numeric" /></td>
</tr>
</tbody>
вот что я попробовал в этом javascript, чтобы получить все значения из ячейки таблицы в массиве объектов. Я не понимаю, почему мой cMetadata
всегда возвращает пустой массив
let cMetadata;
if (document.querySelectorAll("metadata")) {
let tableData = document.querySelectorAll("metadata");
cMetadata = [...tableData].map((row) => {
return {
altions: row.cells[0].textContent,
lexity: row.cells[1].textContent,
};
});
}
конечный массив объекта должен выглядеть следующим образом
cMetadata = [{altions: 1 , lexity: 2},{altions: 2 , lexity: 2},{altions: 3 , lexity: 2}]
Комментарии:
1. Использование
.querySelectorAll()
для таких тривиальных запросов только снижает производительность вашего приложенияdocument.getElementById()
илиdocument.getElementsByTagName()
будет работать быстрее.2. предполагая, что ваша
tableData
переменная должна хранить<tbody>
-node, вы пропустили ‘#’ и должны использовать.querySelector()
(не ‘all’). Т.е..document.querySelector('#metadata')
3. После захвата
<tbody>
вам нужно выполнить дополнительные вложенные запросы для захвата<tr>
<td>
узлов (для детализации до значений вложенных<input>
узлов)4. @Evgengorbunkov — Что, в точном времени, представляет собой дефицит производительности? ИМО, ваш комментарий слишком педантичен и будет иметь почти нулевое влияние на производительность этого кода. (Скорее всего, в диапазоне до микросекунд даже на самом ограниченном процессоре.
5. я уже пробовал это
.document.querySelector('#metadata')
, но это не работает
Ответ №1:
Проверено, что у вас есть tbody
узел внутри table
узла. Вы можете получить предметы с помощью document.querySelectorAll("#metadata tr")
:
const btn = document.querySelector("button");
btn.addEventListener("click", () => {
const elements = document.querySelectorAll("#metadata tr");
const result = Array.from(elements).map(tr => {
const childs = tr.querySelectorAll("input");
return {
p1: childs[0].value,
p2: childs[1].value
};
});
console.log(result);
});
<table>
<tbody id="metadata">
<tr>
<td><input type="numeric"></td>
<td><input type="numeric"></td>
</tr>
<tr>
<td><input type="numeric"></td>
<td><input type="numeric"></td>
</tr>
<tr>
<td><input type="numeric"></td>
<td><input type="numeric"></td>
</tr>
</tbody>
</table>
<button>Get Data</button>
Комментарии:
1. Хороший ответ, вероятно, не помешало бы какое-нибудь объяснение. Но я боролся с тем фактом, что OP не предоставил никаких элементов в строках с текстовым содержимым. Единственное, что есть элементы ввода. Однако код операционной системы предполагает обратное. ОП должен немного прояснить этот вопрос.
2. Это всегда дает мне неопределенное значение, когда у меня есть vale внутри поля ввода
3. Это связано с тем, что код вызывается только один раз в начале фрагмента, вы должны поместить его в функцию, которая запускается при нажатии кнопки или при изменении полей.
4. я ввел это в функцию только тогда, когда попробовал
5. Я бы вообще не советовал жестко кодировать DOM в вашем JS: если вы добавляете другие элементы в свой
<td>
, он внезапно перестает работать без красных флажков, которые вы не должны изменять структуру.