映射到嵌套的对象数组

问题描述

我正在尝试映射对象数组,每个对象包含另一个嵌套的对象数组。但是,该映射不适用于嵌套数组。如何映射嵌套数组的内容

对象嵌套数组的数据结构如下:

const items = [
  {
    page_num: 1,status: "PROCESSED",table_text_data:[
        {bottom:58,height:60,left:60,right:67,text:"recorded"},{bottom:75,height:67,left:50,right:60,text:"symbolic"},{bottom:80,height:80,left:77,right:89,text:"fever"},]
  }
];

page_numstatus的地图如下:

{this.props.items.map(item =>{ 
   return (
        <ul><li> page_num={item.page_num} </li>
         <li> status:{item.status}</li>
          {item.table_text_data.map((c,i)=>( 
           <ul><li>bottom={c.bottom}</li>
           <li>height={c.height}</li>
           <li>left={c.right}</li>
           <li>right={c.left}</li>
           <li>text={c.text}</li></ul>  
         ))}
        </ul>
)})}

page_numstatus可以正常工作,但不适用于table_text_data。我应该如何映射?

我得到的警告的屏幕截图: https://i.stack.imgur.com/sqREQ.png

任何帮助将不胜感激。谢谢

解决方法

为什么不使用重用数组映射?

{this.props.items.map((item,i) =>{ 
   return (
        <ul key={'parent' + i}><li> page_num={item.page_num} </li>
         <li> status:{item.status}</li>
          {item.table_text_data.map((c,j)=>( 
           <li  key={'child' + j}>
           <ul><li>bottom={c.bottom}</li>
           <li>height={c.height}</li>
           <li>left={c.right}</li>
           <li>right={c.left}</li>
           <li>text={c.text}</li></ul>
           </li>
         ))}
        </ul>
)})}
,

您可以使用嵌套地图功能访问文件。但您需要指定嵌套map()仅适用于table_text_data属性,否则,您的父map函数将检查table_text_data中的内容 您可以像这样重写代码

{this.props.items.map(item =>{ 
   return(
<ul>
<li> page_num={item.page_num} </li>
<li> status:{item.status}</li>
</ul>
   if(item ==='table_text_data'){
      {item.table_text_data.map((c,i)=>( 
          return (
 <ul><li>bottom={c.bottom}</li>
           <li>height={c.height}</li>
           <li>left={c.right}</li>
           <li>right={c.left}</li>
           <li>text={c.text}</li></ul> 
))
}
)}
        </ul>
)})}
,

您给出的错误就是答案。

列表中的每个孩子都应具有唯一的key属性

通过提取保存嵌套对象的索引,您已经到了一半。 现在,您只需将属性key={I}添加到您的ul

const items = [
  {
    page_num: 1,status: "PROCESSED",table_text_data:[
        {bottom:58,height:60,left:60,right:67,text:"recorded"},{bottom:75,height:67,left:50,right:60,text:"symbolic"},{bottom:80,height:80,left:77,right:89,text:"fever"},]
  },{
    page_num: 2,]
  }
];
    
const ItemDisplay = (props) => (
  <React.Fragment>
    {props.items.map(item => (
      <ul key={item.page_num}>
        <li>page_num={item.page_num}</li>
        <li>status={item.status}</li>
        {item.table_text_data.map((c,i) => ( 
          <ul key={i}>
            <li>bottom={c.bottom}</li>
            <li>height={c.height}</li>
            <li>left={c.right}</li>
            <li>right={c.left}</li>
            <li>text={c.text}</li>
          </ul>  
        ))}
      </ul>
    ))}
  </React.Fragment>
  );

ReactDOM.render(
  <ItemDisplay items={items} />,document.getElementById("react")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="react"></div>