【问题标题】:Map over nested array of objects映射嵌套的对象数组
【发布时间】:2021-02-08 12:56:51
【问题描述】:

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

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

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

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

【问题讨论】:

标签: javascript reactjs jsx arrayobject


【解决方案1】:

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

{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>
)})}

【讨论】:

  • 我现在试过了,但还是没有运气。它也没有消除错误。可能是什么问题?
  • 您的具体要求是什么?你能看到什么错误?
  • 我想提取table_text_data里面的内容。这似乎是一些逻辑错误。我已经根据您给定的 sn-p 编辑了上面的代码。请检查一下。
  • 删除第 4 行中的
  • 我做到了。但仍然没有运气:(
【解决方案2】:

你给出的错误是有答案的。

列表中的每个孩子都应该有一个唯一的 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,
    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"},
    ]
  }
];
    
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>

【讨论】:

    【解决方案3】:

    您可以使用嵌套映射函数来访问文件。但是您需要指定嵌套的 map() 仅适用于 table_text_data 属性,否则您的父映射函数将检查 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>
    )})}
    

    【讨论】:

    • 没有用。无法指定 if 语句。如果可能,还有其他解决方案吗?
    猜你喜欢
    • 2023-01-23
    • 2022-08-10
    • 2021-09-30
    • 1970-01-01
    • 2021-07-26
    • 2019-01-07
    • 2021-06-23
    • 2020-09-27
    • 1970-01-01
    相关资源
    最近更新 更多