Цикл forEach продолжает добавляться только к первому дочернему элементу

Я немного в ступоре. Я запускаю цикл forEach для API, который будет создавать новый div для каждого результата с добавлением некоторого html внутри него. Пока данные извлекаются, они добавляются только к первому созданному div. Я пытаюсь убедиться, что каждый набор текста попадает в каждый отдельный div. Может ли кто-нибудь просветить меня, что я делаю неправильно? Спасибо

app.displayResults = (arrayOfObjects) => {
  arrayOfObjects.forEach((Object) =>{
    
    const number = Object.house_number;
    const address = Object.street_name;
    const zipCode = Object.zip_code;
    const borough = Object.borough;
    const date = Object.inspection_date;
    const initial = Object.inspection_type;
    const iResult = Object.result;
  
    const resultContainer = document.createElement("div");
    resultContainer.classList.add('resultContainer');
    document.querySelector('.inspectionResults').append(resultContainer); 
    
    const innerHTML = `
    <p class = "recordDetails"> ADDRESS: ${number}${address}</p>
    <p class = "recordDetails"> DATE: ${date}</p>
    <p class = "recordDetails"> BOROUGH: ${borough}</p>`

    const record = document.createElement("div");
    record.classList.add('record');
    record.innerHTML = `${innerHTML}`

    document.querySelector(".resultContainer").append(record)
  })
}

К вашему сведению, Object — это предопределенная переменная в JS, поэтому измените имя этой переменной на другое.

code 09.10.2022 05:20

потому что document.querySelector всегда будет выбирать первый соответствующий элемент - попробуйте resultContainer.append(record), поскольку у вас есть эта переменная, содержащая элемент, к которому вы хотите добавить

Jaromanda X 09.10.2022 05:23

@code есть ли способ обойти это?

Learn to Code 09.10.2022 05:24

Просто измените имя переменной на другое.

code 09.10.2022 05:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
65
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

В последней строке вашего обратного вызова forEach вы запрашиваете первый элемент .resultContainer вместо того, который вы создали ранее. Вместо того, чтобы сразу добавлять этот div в DOM, добавьте свой record к resultContainer, затем добавьте только resultContainer к DOM, вот так (я изменил Object на obj, потому что Object уже определен):

app.displayResults = (arrayOfObjects) => {
  arrayOfObjects.forEach((obj) =>{
    const number = obj.house_number;
    const address = obj.street_name;
    const zipCode = obj.zip_code;
    const borough = obj.borough;
    const date = obj.inspection_date;
    const initial = obj.inspection_type;
    const iResult = obj.result;
  
    const resultContainer = document.createElement("div");
    resultContainer.classList.add('resultContainer');
    
    const innerHTML = `
    <p class = "recordDetails"> ADDRESS: ${number}${address}</p>
    <p class = "recordDetails"> DATE: ${date}</p>
    <p class = "recordDetails"> BOROUGH: ${borough}</p>`

    const record = document.createElement("div");
    record.classList.add('record');
    record.innerHTML = `${innerHTML}`

    resultContainer.appendChild(record); // instead of directly appending record to document append it to the container, then append the container to the document
    document.querySelector('.inspectionResults').append(resultContainer); 
  })
}

@confusedCoder здорово! Надеюсь, это решило вашу проблему. Если да, не могли бы вы также пометить ответ как принятый? Спасибо!

code 09.10.2022 05:26

@confusedCoder, почему бы не принять это?

flyingfox 09.10.2022 05:45

Как насчет добавления идентификатора?

terms.setAttribute(‘id’,‘para-1’);

app.displayResults = (arrayOfObjects) => {
  arrayOfObjects.forEach((obj) =>{
    /*
    const number = Object.house_number;
    const address = Object.street_name;
    const zipCode = Object.zip_code;
    const borough = Object.borough;
    const date = Object.inspection_date;
    const initial = Object.inspection_type;
    const iResult = Object.result;
    */
    // Destructuring Assignment maybe better here
    const { house_number : number, 
           street_name : address, 
           zip_code : zipCode,
           borough,
           inspection_date : date,
           inspection_type : initial,
           result : iResult } = obj
  
    const resultContainer = document.createElement("div");
    resultContainer.classList.add('resultContainer');

    // below is the problem, you appended several divs with the class name 'resultContainer', every time you query, there were a array of it, and you always got the first.
    // document.querySelector('.inspectionResults').append(resultContainer); 
    
    const innerHTML = `
    <p class = "recordDetails"> ADDRESS: ${number}${address}</p>
    <p class = "recordDetails"> DATE: ${date}</p>
    <p class = "recordDetails"> BOROUGH: ${borough}</p>`

    const record = document.createElement("div");
    record.classList.add('record');
    record.innerHTML = innerHTML

    // here just append to the exact div you created above
    resultContainer.append(record)
    // then append the container which contains the content you expected to the documment
    document.querySelector('.inspectionResults').append(resultContainer);
  })
}

Другие вопросы по теме