Я обнаружил, что код работает так, как я предполагал (я думаю). Но последний шаг, на котором я печатаю данные, кажется неправильным. То, как я объединяю html и js, кажется немного неправильным. Есть ли лучший способ объединить это? Я использую неправильное решение для печати данных?
// Этот список я использую внутри своего массива.
const myList = {
Germany : {name : 'Germany', capital: 'Berlin', visited: 'Checked' },
Italy : {name : 'Italy', capital: 'Rome', visited: 'Checked' },
Spain : {name : 'Spain', capital: 'Madrid', visited: 'unchecked' },
}
// Мой массив
const destinations = [];
// Отправляем данные из myList в массив назначения.
for(var key in myList) {
destinations.push(myList[key]);
}
// Вот так я записываю свои данные на страницу.
for (var i = 0; i < destinations.length; i++) {
document.write("<li><h1>" + destinations[i].name + "</h1><p>" +
destinations[i].capital +
"<input type='checkbox'" + destinations[i].visited + ">")
};
Это то, что я планирую написать в конце.
<li class = "all-destinations">
<h3>destinations[i].name</h3>
<div class = "container">
<label class = "switch">
<input type = "checkbox" destinations[i].visited>
</label>
</div>
<p>destinations[i].capital</p>
<hr>
</li>
Вы можете сделать это лучше, переместив логику конкатенации в отдельную функцию, которая возвращает только html. Таким образом, это будет работать как шаблон.



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


Вы улучшили свой код тремя способами:
Object.values() вместо того, чтобы создавать [] и нажимать на него.forEach() вместо простых циклов forconst myList = {
Germany : {name : 'Germany', capital: 'Berlin', visited: 'Checked' },
Italy : {name : 'Italy', capital: 'Rome', visited: 'Checked' },
Spain : {name : 'Spain', capital: 'Madrid', visited: 'unchecked' },
}
const list = Object.values(myList);
list.forEach(x => {
document.write(
`<li class = "all-destinations">
<h3>${x.name}</h3>
<div class = "container">
<label class = "switch">
<input type = "checkbox" ${x.visited}>
</label>
</div>
<p>${x.capital}</p>
<hr>
</li>`)
})Спасибо за отличный вклад! Я многому научился из вашего ответа, но все же решил принять ответ @Nina Scholz как правильный.
Вы можете присвоить значения свойству innerHTML напрямую без document.write, что может не сработать, если страница уже полностью загружена.
function getItems({ name, capital, visited }) {
return `<li class = "all-destinations">
<h3>${name}</h3>
<div class = "container">
<label class = "switch">
<input type = "checkbox" ${visited}>
</label>
</div>
<p>${capital}</p>
<hr>
</li>`;
}
const myList = { Germany: { name: 'Germany', capital: 'Berlin', visited: 'Checked' }, Italy: { name: 'Italy', capital: 'Rome', visited: 'Checked' }, Spain: { name: 'Spain', capital: 'Madrid', visited: 'unchecked' } };
document.getElementById('list').innerHTML += Object.values(myList).map(getItems).join('');<ul id = "list"></ul>
Вместо того, чтобы перебирать ключи
myList, вы можете просто сделать:const destinations = Object.values(myList)