Я пытаюсь создать кнопку сортировки определенных данных, чтобы я мог отсортировать их по возрастанию, но в коде есть ошибка, с чего мне начать? Спасибо
var planetsObj = [{
name: "Alderaan",
rotation_period: 24,
orbital_period: 364
},
{
name: "Yavin IV",
rotation_period: 24,
orbital_period: 4818
},
{
name: "Hoth",
rotation_period: 23,
orbital_period: 549
},
{
name: "Dagobah",
rotation_period: 23,
orbital_period: 341
},
{
name: "Bespin",
rotation_period: 12,
orbital_period: 5110
}
]
var sortID = function compare(a, b) {
if (a.name < b.name)
return -1;
if (a.name > b.name)
return 1;
return 0;
}
planetsObj.sort(sortID);
window.onload = function compare() {
document.getElementById("mybutton").onclick = sortID;
}
text = ''
for(var i=0;i<planetsObj.length;i++){
console.info(planetsObj[i])
name = planetsObj[i].name;
text += '<div>' +name+ '</div>';
}
document.querySelector('div#tbody').innerHTML = text
text = '';
for(var i=0;i<planetsObj.length;i++){
console.info(planetsObj[i])
rotation_period= planetsObj[i].rotation_period;
text += '<div>' +rotation_period+ '</div>';
}
document.querySelector('div#yes').innerHTML = text
text = '';
for(var i=0;i<planetsObj.length;i++){
console.info(planetsObj[i])
orbital_period= planetsObj[i].orbital_period;
text += '<div>' +orbital_period+ '</div>';
}
document.querySelector('div#no').innerHTML = text
</script><body>
<p>Click the button to sort the table alphabetically, by name:</p>
<input type = "button" id = "mybutton" value = "sort by name">
<Table class = "rTable">
<div id = "tbody"></div>
<div id = "yes"></div>
<div id = "no"></div>
</Table>Я ожидаю, что каждый раз, когда я нажимаю кнопку, данные будут сортироваться по возрастанию, извините, если вопрос слишком простой, потому что я все еще новичок, большое спасибо
Что вы пытаетесь отсортировать, когда нажимаете кнопку? В таблице ничего нет.
Если вы хотите отсортировать массив, вам нужно сделать planetsObj.sort(sortID) в функции onclick. sortID — это просто функция сравнения, она ничего не сортирует.
@Barmar Большое спасибо, сэр, я исправлю <table>, извините, я не поставил полный javascript, но я уже отредактировал его с полной кодировкой.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам нужно добавить метод для вызова функции сортировки и добавить в событие addEventListener('click', sort);
function sort(){
planetsObj.sort(sortID);
console.info(planetsObj);
}
window.onload = function compare() {
document.getElementById("mybutton").addEventListener('click', sort);
}
Обновлено: обновление объекта списка отображения в таблице с использованием javascript.
var planetsObj = [{
name: "Alderaan",
rotation_period: 24,
orbital_period: 364
},
{
name: "Yavin IV",
rotation_period: 24,
orbital_period: 4818
},
{
name: "Hoth",
rotation_period: 23,
orbital_period: 549
},
{
name: "Dagobah",
rotation_period: 23,
orbital_period: 341
},
{
name: "Bespin",
rotation_period: 12,
orbital_period: 5110
}
]
var sortID = function compare(a, b) {
//console.info(JSON.stringify(a))
if (a.name < b.name)
return -1;
if (a.name > b.name)
return 1;
return 0;
}
function sort(){
planetsObj.sort(sortID);
//console.info(planetsObj);
var tableRef = document.getElementById('rTable').getElementsByTagName('tbody')[0];
for(var i= 0; i < planetsObj.length; i++){
// Insert a row in the table at the last row
var newRow = tableRef.insertRow(tableRef.rows.length);
// Insert a cell in the row at index 0
var newCell = newRow.insertCell(0);
// Append a text node to the cell
var newText = document.createTextNode(planetsObj[i].name);
newCell.appendChild(newText);
var newCell2 = newRow.insertCell(1);
// Append a text node to the cell
var newText2 = document.createTextNode(planetsObj[i].rotation_period);
newCell2.appendChild(newText2);
var newCell3 = newRow.insertCell(2);
// Append a text node to the cell
var newText3 = document.createTextNode(planetsObj[i].orbital_period);
newCell3.appendChild(newText3);
}
}
window.onload = function compare() {
document.getElementById("mybutton").addEventListener('click', sort);
}<body>
<p>Click the button to sort the table alphabetically, by name:</p>
<input type = "button" id = "mybutton" value = "sort by name">
<table border = "1" class = "rTable" id = "rTable">
<thead>
<tr>
<th>name</th>
<th>rotation_period</th>
<th>orbital_period</th>
</tr>
</thead>
<tbody>
</tbody>
</table>Большое спасибо за помощь, пропускаю событие addEventListener, попробую отредактировать домашнюю работу
Я попробовал ваш ответ, и это сработало, я хотел бы спросить, как переставить div так, чтобы сортировались не только консоли, спасибо
Если вы хотите сортировать массив при нажатии кнопки, вам нужно написать функцию, которая делает это, и использовать ее в функции onclick:
window.onload = function() {
document.getElementById("mybutton").onclick = function() {
planetsObj.sort(sortID);
}
}
Большое спасибо, сэр, за вашу помощь, я постараюсь отредактировать домашнее задание.
Сортировка может быть реализована в вашем случае путем сортировки объектов и перестроения таблицы.
Приведенный ниже код при нажатии кнопки сортирует объект планет и перестраивает отсортированную таблицу.
Чтобы сделать сортировку универсальной на основе любого столбца, измените логику сортировки и создайте событие по клику на основе заголовка таблицы.
Ниже приведен пример кода:
<html>
<head>
<style>
table {
border-collapse: collapse;
}
th, td {
border: 1px solid black;
}
</style>
<script>
var planetsObj = [
{
name: "Alderaan",
rotation_period: 24,
orbital_period: 364
},
{
name: "Yavin IV",
rotation_period: 24,
orbital_period: 4818
},
{
name: "Hoth",
rotation_period: 23,
orbital_period: 549
},
{
name: "Dagobah",
rotation_period: 23,
orbital_period: 341
},
{
name: "Bespin",
rotation_period: 12,
orbital_period: 5110
}
]
var planetLabels = ['name', 'rotation_period','orbital_period'];
var sortID = function compare(a,b) {
if (a.name < b.name)
return -1;
if (a.name > b.name)
return 1;
return 0;
}
function sortRows(){
planetsObj.sort(sortID);
buildTable(planetLabels, planetsObj, document.getElementById('rTable'));
}
window.onload = function compare() {
buildTable(planetLabels, planetsObj, document.getElementById('rTable'));
}
document.getElementById("mybutton").onclick = sortRows();
function buildTable(labels, objects, tableObj) {
var thead = document.createElement('thead');
var tbody = document.createElement('tbody');
var theadTr = document.createElement('tr');
for (var i = 0; i < labels.length; i++) {
var theadTh = document.createElement('th');
theadTh.innerHTML = labels[i];
theadTr.appendChild(theadTh);
}
thead.appendChild(theadTr);
tableObj.appendChild(thead);
for (j = 0; j < objects.length; j++) {
var tbodyTr = document.createElement('tr');
for (k = 0; k < labels.length; k++) {
var tbodyTd = document.createElement('td');
tbodyTd.innerHTML = objects[j][labels[k].toLowerCase()];
tbodyTr.appendChild(tbodyTd);
}
tbody.appendChild(tbodyTr);
}
tableObj.appendChild(tbody);
}
</script>
</head>
<body>
<p>Click the button to sort the table alphabetically, by name:</p>
<input type = "button" id = "mybutton" value = "sort by name">
<table class = "rTable" id = "rTable">
</table>
</body>
</html>
Большое спасибо за помощь, постараюсь отредактировать домашнее задание
Вы не можете поместить элементы
<div>непосредственно в<table>. Он может содержать только<tr>элементов (или<thead>,<tbody>и<tfoot>, которые содержат строки).