Добавить массив объектов в качестве элементов в существующую таблицу td

У меня есть существующая таблица. Я намеренно отображаю ячейки td как блоки. :) Моя цель — добавить метки внутри каждого из td, создав интервалы с определенным классом, а затем добавить их в ячейку таблицы. Я использую массив объектов с данными метки, «значком» и «именем».

Добавить массив объектов в качестве элементов в существующую таблицу td

У меня возникли проблемы с применением значков по отдельности к td. Все они сгруппированы вместе в каждой ячейке.

Добавить массив объектов в качестве элементов в существующую таблицу td

Несколько проблем, которые я пытаюсь решить:

  1. Добавьте каждый объект (один значок и одну метку) в каждую ячейку
  2. При создании элементов добавьте класс значков в диапазон значков и класс меток в диапазон меток.
  3. Примените их соответствующим образом в порядке, указанном в объекте

Я пробовал кучу разных вещей (см. комментарии к коду) и много хороших сообщений здесь, на SO, но эта функция, кажется, приближает меня к моей цели. Любая помощь очень ценится.

let items = [{
    id: "?",
    name: "snail"
  },
  {
    id: "?",
    name: "ant"
  },
  {
    id: "?",
    name: "beetle"
  },
  {
    id: "?",
    name: "honeybee"
  },
  {
    id: "?",
    name: "spider"
  }
];

function createLabel(obj) {
  // let loc = document.getElementsByTagName("#profiles td");
  let loc = document.querySelectorAll("#profiles td");

  if (typeof obj !== "undefined" && obj !== null) {
    // loop through td's
    for (let i = 0; i < loc.length; i++) {
      // apply object data
      obj.forEach((item) => {
        Object.values(item).forEach((text) => {
          // loc.prepend(span);

          // I also tried my for loop here with similar weird results

          let span = document.createElement("span");
          let textNode = document.createTextNode(text);
          // 'id' should get .icon
          // 'name' should get .label
          span.className = 'icon';
          span.append(textNode);
          loc[i].prepend(span);
        });
      });
    }
  }
}
createLabel(items);
<table id = "profiles">
  <tr>
    <td>Snail Stuff</td>
    <td>Ant Stuff</td>
    <td>Beetle Stuff</td>
    <td>Honeybee Stuff</td>
    <td>Spider Stuff</td>
  </tr>
</table>
Поведение ключевого слова "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) для оценки ваших знаний,...
1
0
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы использовали document.querySelectorAll. Вы можете просто использовать document.querySelector, чтобы получить таблицу и запустить цикл for of, чтобы добавить элемент в таблицу.

let items = [
  { id: "?", name: "snail", text: "Snail Stuff" },
  { id: "?", name: "ant", text: "Ant Stuff" },
  { id: "?", name: "beetle", text: "Beetle Stuff" },
  { id: "?", name: "honeybee", text: "Honeybee Stuff" },
  { id: "?", name: "spider", text: "Spider Stuff" }
];

function createLabel(obj) {
  const loc = document.querySelector("#profileRow");
  const elements = [];

  for (const item of obj) {
    const el = document.createElement("td");
    el.innerHTML = `<span class='icon'>${item.id}</span> <span class='label'>${item.name}</span> ${item.text}`;
    elements.push(el);
  }

  loc.append(...elements);
}
createLabel(items);
td {
  display: block;
  border: 1px solid #ccc;
}
span {
  display: inline-block;
}
.icon {
  background: yellow;
  width: 3rem;
  text-align: center;
}
.label {
  font-weight: bold;
  width: 6rem;
}


.pie {
  margin-top: 4rem;
}
<!DOCTYPE html>
<html>
  <head>
    <title>Parcel Sandbox</title>
    <meta charset = "UTF-8" />
  </head>

  <body>
    <table id = "profiles">
      <tr id = "profileRow"></tr>
    </table>
  </body>
</html>

Лучше объяснить, что ваш код делает по-другому, где ОП пошла не так и т. д., а не просто дамп кода.

Lee Taylor 07.05.2022 01:31

@LeeTaylorДа готово

Inder 07.05.2022 01:35

Хорошо, я понял. Благодарю вас! Я по ошибке пытался перебрать ячейки таблицы, затем перебрать объект и вставить данные. Классический случай переосмысления проблемы. Мне нравится использовать литералы шаблонов, чтобы сделать его еще чище.

carbonspace 07.05.2022 01:42

@Inder Мне нравится этот ответ, но как он будет работать с моим html? В этих ячейках будут существующие данные, и каждая «строка» получит одинаковые метки. Используя этот метод, ДОБАВЛЯЕТ td, который становится еще одним набором «строк», которых я хочу избежать. Я хочу просто добавить два промежутка внутри перед существующими данными.

carbonspace 07.05.2022 04:01

@carbonspace есть только одна строка, внутри которой добавляется больше ячеек. Я использую теги td, а не tr. Я добавляю ячейки в одну строку.

Inder 07.05.2022 07:34

Вы имеете в виду, как вы будете использовать теги th?

Inder 07.05.2022 07:37

Я понимаю, что ваш код просто отличается от того, что я просил, и вы изменили мой html на что-то другое. Ваше решение не добавляет диапазон ВНУТРИ td, оно добавляет еще один td. Я получил for..of работы здесь, но мне пришлось добавить var для увеличения. codepen.io/carbonspace/pen/MWQKWYB Кроме того, использование innerHTML сотрет весь существующий контент, чего я определенно не хочу делать.

carbonspace 09.05.2022 17:20

@carbonspace В моем коде html добавляется через javascript. Если вы хотите добавить больше тегов td, вы можете просто вызвать функцию и передать массив. html, который у вас был изначально, остается прежним, только он добавляется через js. Вам решать, что вы хотите реализовать в своем приложении.

Inder 09.05.2022 19:42
Ответ принят как подходящий

Я думаю, проблема в том, что вы дважды перебираете элементы. С первым для этого должно быть достаточно

Это мой ход:

let items = [{
    id: "?",
    name: "snail"
  },
  {
    id: "?",
    name: "ant"
  },
  {
    id: "?",
    name: "beetle"
  },
  {
    id: "?",
    name: "honeybee"
  },
  {
    id: "?",
    name: "spider"
  },
];

//created a function so that we don't repeat the span creation
function createSpan(text, className) {
  let span = document.createElement('span')
  span.className = className;
  let textNode = document.createTextNode(text)
  span.append(textNode)
  return span
}

function createLabel(obj) {
  // let loc = document.getElementsByTagName("td");
  let loc = document.querySelectorAll("#profiles td");

  if (typeof obj !== "undefined" && obj !== null) {
    // loop through td's
    for (let i = 0; i < loc.length; i++) {
      // apply object data
      // loc.prependspan;
      //destructure the item so that we get its properties, it's the same as doing const id = items[i].id and const name=items[i].name but all in one line!
      const {
        id,
        name
      } = items[i]
      const iconSpan = createSpan(id, 'icon')
      // 'id' should get .icon
      // 'name' should get .label

      let labelSpan = createSpan(name, 'label')
      loc[i].prepend(iconSpan, labelSpan);
      // loc[i].insertAdjacentHTML('afterbegin', span);
      ;
    }
  }
}
createLabel(items);
<table id = "profiles">
  <tr>
    <td>Snail Stuff</td>
    <td>Ant Stuff</td>
    <td>Beetle Stuff</td>
    <td>Honeybee Stuff</td>
    <td>Spider Stuff</td>
  </tr>
</table>

Кажется, это не так, как хотел ОП.

Lee Taylor 07.05.2022 01:37

Ницца. Я хотел попытаться обернуть все это в одну функцию, но этот ответ работает [codepen.io/carbonspace/pen/NWyxWqa], и это неплохой способ сделать это. Интересный способ получить данные об объекте и хорошее решение. Благодарю вас!

carbonspace 07.05.2022 01:52

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