Ошибка: Объекты недопустимы в качестве дочернего элемента React при попытке сопоставить вложенный массив для компонента таблицы в React

#javascript #reactjs #object #frontend #syntax-error

#язык JavaScript #реагирует на #объект #внешний интерфейс #синтаксическая ошибка

Вопрос:

До сих пор мой код работал нормально. Пока мне не пришлось изменить файл данных и создать внутри него вложенный массив. Я получаю ошибку: Объекты недопустимы в качестве дочернего элемента React (найдено: объект с ключами {one, B, C, D, E, G, H, I, L, M, N, P, Q, R, S}). Если вы хотели отобразить коллекцию дочерних элементов, вместо этого используйте массив.

Ниже приведен мой компонент таблицы

 import React from "react"; import tableData from "./tableData1.js";  const TableComponent = ({ data }) =gt; { let headings = Object.keys(data[0]);  return (  lt;table className="table table-dark table-striped"gt;  lt;theadgt;  lt;trgt;  lt;th colspan="16"gt;Dimensions in mmlt;/thgt;  lt;/trgt;  lt;tr scope="col"gt;  lt;thgt;Serieslt;/thgt;  {headings.map((heading) =gt; (  lt;thgt;{heading}lt;/thgt;  ))}  lt;/trgt;  lt;/theadgt;  lt;tbodygt;  {data.map((item) =gt; (  lt;tr scope="col"gt;  lt;th scope="row"gt;Series No.lt;/thgt;  {headings.map((heading) =gt; (  lt;tdgt;{item[heading]}lt;/tdgt;  ))}  lt;/trgt;  ))}  lt;/tbodygt;  lt;/tablegt;  ); };  const TableGenerator = ( {targetID} ) =gt; {  const filteredData = tableData.filter(item =gt; item.id == targetID ).map(item =gt; item.value);  return lt;TableComponent data={filteredData} /gt;; };  export default TableGenerator;   

А вот файл данных, в котором в настоящее время используются только некоторые макетные данные для тестирования.

 const tableData1 = [  {  id: 1,  value: [  {  one: "Value",  B: "Value",  C: "Value",  D: "Male",  E: "Value",  G: "Value",  H: "Value",  I: "Value",  L: "Value",  M: "Value",  N: "Value",  P: "Value",  Q: "Value",  R: "Value",  S: "Value",  },  {  one: "Value",  B: "Value",  C: "Value",  D: "Male",  E: "Value",  G: "Value",  H: "Value",  I: "Value",  L: "Value",  M: "Value",  N: "Value",  P: "Value",  Q: "Value",  R: "Value",  S: "Value",  },  ],  },  {  id: 2,  value: [  {  two: "Value",  B: "Value",  C: "Value",  D: "Male",  E: "Value",  G: "Value",  H: "Value",  I: "Value",  L: "Value",  M: "Value",  N: "Value",  P: "Value",  Q: "Value",  R: "Value",  S: "Value",  },  {  two: "Value",  B: "Value",  C: "Value",  D: "Male",  E: "Value",  G: "Value",  H: "Value",  I: "Value",  L: "Value",  M: "Value",  N: "Value",  P: "Value",  Q: "Value",  R: "Value",  S: "Value",  },  ],  } ]  

Ранее у меня было это в формате ниже:

 const tableData1 = [  {  id: 1,  value:  {  one: "Value",  B: "Value",  C: "Value",  D: "Male",  E: "Value",  G: "Value",  H: "Value",  I: "Value",  L: "Value",  M: "Value",  N: "Value",  P: "Value",  Q: "Value",  R: "Value",  S: "Value",  }  },  {  id: 2,  value:  {  two: "Value",  B: "Value",  C: "Value",  D: "Male",  E: "Value",  G: "Value",  H: "Value",  I: "Value",  L: "Value",  M: "Value",  N: "Value",  P: "Value",  Q: "Value",  R: "Value",  S: "Value",  }  } ]  

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

Комментарии:

1. Я теряюсь в том, какой тип этого должен работать, макет или предыдущие данные?

2. const filteredData = табличные данные.фильтр(элемент =gt; item.id == TargetID ).карта(элемент =gt;gt; элемент.значение); в методе карты каждый элемент: [ { один: «Значение», B: «Значение», C: «Значение», D: «Мужчина», …}, { один: «Значение», B: «Значение», C: «Значение», D: «Мужчина», …}] таким образом, вам нужна другая карта для каждого из этих элементов, и зачем вам может понадобиться дубликат объекта?

3. Рассматривается как значение, которое превратилось из одноэлементного объекта в массив объектов. Разве вы сейчас не хотите визуализировать несколько компонентов таблицы?.. Поскольку TableComponent ожидает объект, а не массив..

4. @Венковский макет данных, которыми я поделился первым, — это то, где мне нужно, чтобы он работал, так как он уже работает для второго.

5. @Ebay то, чего я в основном пытаюсь достичь, — это объект.ключи предназначены для получения всех заголовков от каждого из объектов внутри массива значений, а остальная часть кода предназначена для создания строк под этими заголовками на основе значений этих заголовков(свойств), если это имеет какой-либо смысл.

Ответ №1:

Поскольку в вашей новой структуре value сам по себе массив, на самом деле у вас есть вложенный массив, вы можете обновить filterData его следующим образом:

 const filteredData = tableData.filter(item =gt; item.id == targetID).reduce((acc, item)=gt;{  acc = [...acc, ...item.value]  return acc; } , []);  

Комментарии:

1. это сделало это! Я был немного смущен тем, как правильно получить доступ к этим данным, и это работает просто отлично. предыдущий ответ тоже сработал, кстати. Спасибо!