#javascript #html #css #dom
Вопрос:
Я хочу отобразить массив значений объектов(приведенных ниже) с помощью javascript. Когда я перебираю массив задач и визуализирую элементы, все в порядке. Но я хочу иметь цикл внутри внешнего цикла для отображения подзадач каждой задачи. Но, если я пройдусь по каждой подзадаче, как указано ниже, то это приведет к ошибке в консоли, как task.subTasks.forEach(...) is not a function
const tasks = [
{
id: 0,
description: "task 1",
subTasks: [
{ id: 0, description: "subtask 1" },
{ id: 1, description: "subtask 2" },
],
},
{
id: 1,
description: "task 2",
subTasks: [
{ id: 0, description: "subtask 3" },
{ id: 1, description: "subtask 4" },
],
},
{
id: 2,
description: "task 3",
subTasks: [
{ id: 0, description: "sub task 5" },
{ id: 1, description: "sub task 6" },
],
},
];
const accordion = document.querySelector("#accordion");
function displayTasks() {
tasks.forEach((task, index) => {
let html = `
<div class="accordion-item" id="${index}">
<div class="todo-task">
<i class="far fa-circle"></i>
<input value="${task.description}" placeholder="Update your task" type="text">
<i class="fas fa-pen"></i>
<i class="fa fa-trash"></i>
<a href="#${index}"><i class="fas fa-chevron-down"></i></a>
</div>
<div class="todo-sub-tasks">
`
task.subTasks.forEach((item,index)=>{
<div class="todo-sub-task">
<i class="far fa-circle"></i>
<input placeholder="Update your sub task" type="text" />
<i class="fas fa-pen"></i>
<i class="fa fa-trash"></i>
</div>
})
`
</div>
</div>
`;
accordion.insertAdjacentHTML("beforeend", html);
});
}
displayTasks();
Комментарии:
1. Пожалуйста, используйте
map()
вместоforEach
.forEach
не возвращает никакого значения.2. Да, я изменился. Все еще бросаю ошибку.
3. Ваша
html
переменная должна быть объявлена внеmap()
вызова. Вам нужно передать результатmap()
вызова в вашуhtml
переменную.
Ответ №1:
Ваша html
переменная должна быть объявлена вне вызова цикла, чтобы вы могли ввести в нее результат цикла.
Внутренняя переменная используется в приведенном ниже примере для компиляции необходимого HTML-кода для каждой задачи.
const tasks = [{
id: 0,
description: "task 1",
subTasks: [
{ id: 0, description: "subtask 1" },
{ id: 1, description: "subtask 2" }
]
}, {
id: 1,
description: "task 2",
subTasks: [
{ id: 0, description: "subtask 3" },
{ id: 1, description: "subtask 4" }
]
}, {
id: 2,
description: "task 3",
subTasks: [
{ id: 0, description: "sub task 5" },
{ id: 1, description: "sub task 6" }
]
}];
const accordion = document.querySelector("#accordion");
function displayTasks() {
const html = tasks.map((task, index) => {
let taskHTML = `
<div class="accordion-item" id="${index}">
<div class="todo-task">
<i class="far fa-circle"></i>
<input value="${task.description}" placeholder="Update your task" type="text">
<i class="fas fa-pen"></i>
<i class="fa fa-trash"></i>
<a href="#${index}"><i class="fas fa-chevron-down"></i></a>
</div>
<div class="todo-sub-tasks">
`;
taskHTML = task.subTasks.map((subTask) => (`
<div class="todo-sub-task">
<i class="far fa-circle"></i>
<input value="${subTask.description}" placeholder="Update your sub task" type="text" />
<i class="fas fa-pen"></i>
<i class="fa fa-trash"></i>
</div>
`));
taskHTML = `
</div>
</div>
`;
return taskHTML;
});
accordion.insertAdjacentHTML("beforeend", html);
}
displayTasks();
<div id="accordion"></div>