如何使用带有条件包装的 map() 函数在 JSX 中呈现数组条目

Posted

技术标签:

【中文标题】如何使用带有条件包装的 map() 函数在 JSX 中呈现数组条目【英文标题】:How to render array entries in JSX using map() function with conditional wrapping 【发布时间】:2018-12-19 15:16:21 【问题描述】:

我在 javascript 中有一个对象数组,我想遍历这些对象并返回一些带有引导类的 JSX,这样每行总是在其中显示 2 列。

options: [
  
    "letter":"A",
    "text": "14 March 1879"
  ,
  
    "letter":"B",
    "text": "14 March 1897"
  ,
  
    "letter":"C",
    "text": "24 May 1879"
  ,
  
    "letter":"D",
    "text": "24 June 1879"
  
]

根据我使用其他语言和模板引擎的经验,这非常简单:您只需创建一个带有row 类的打开和关闭div 标签,然后使用您的模板引擎,循环并渲染每个标签对象,直到您的循环计数器为2,您动态地结束该角色并开始一个新角色。

类似这样的:

<div class="row">
    for (var i in options) 
      if(i%2 === 0) 
        <!-- render object ... -->
        </div><!-- then end this row -->
        <div class="row"><!-- start new row -->
       else 
        <!-- render object -->
      
    
</div>

我在我的 map 函数中尝试了这个方法,它给出了一个语法错误,因为在条件通过的情况下返回的值不是有效的 JSX。

感谢您的帮助。

编辑:

最后,我想要实现的是:

如果对象数组包含 2 个对象,我应该可以像这样动态显示它:

 <div class="row">
  <div class="col-md-6">
    <div class="option correct-option">
      A <!-- that is, option.letter -->
    </div>
  </div>
  <div class="col-md-6">
    <div class="option wrong-option">
      B <!-- that is, option.letter -->
    </div>
  </div>
</div>

如果数组包含3个对象,我想实现这个:

 <div class="row">
  <div class="col-md-6">
    <div class="option correct-option">
      A <!-- that is, option.letter -->
    </div>
  </div>
  <div class="col-md-6">
    <div class="option wrong-option">
      B <!-- that is, option.letter -->
    </div>
  </div>
</div>

<div class="row">
  <div class="col-md-6">
    <div class="option correct-option">
      C <!-- that is, option.letter -->
    </div>
  </div>
</div>

【问题讨论】:

贴出你要实现的html 【参考方案1】:

这样的事情怎么样?

options.map((option, i) => (
    i % 2 === 0 ? null : ( // skip every 2nd row
      <div class="row">
        A: option
        B: i < options.length ? options[i + 1] : null
      </div>
    )
)

【讨论】:

感谢您的回答。它有效,但返回数组的第一个元素为空。我不知道为什么,但我还没有弄清楚【参考方案2】:

您可以使用常规 for 循环增加 i,每个循环增加 2 个,并检查第二个选项是否设置为处理长度不均匀的数组:

示例

function App() 
  const content = [];

  for (let i = 0; i < options.length; i += 2) 
    content.push(
      <div class="row">
        <div class="col-md-6">
          <div class="option correct-option">options[i].text</div>
        </div>
        options[i + 1] && (
          <div class="col-md-6">
            <div class="option correct-option">options[i + 1].text</div>
          </div>
        )
      </div>
    );
  

  return <div>content</div>;

【讨论】:

【参考方案3】:

HTML:

结果:

验证: 适用于: 数组长度 = 0 & Array.length = n 你想要 3 Cols?...定义一个 const 而不是幻数“2”....

代码:

const options = [
  
    "letter":"A",
    "text": "14 March 1879"
  ,
  
    "letter":"B",
    "text": "14 March 1897"
  ,
  
    "letter":"C",
    "text": "24 May 1879"
  ,
];
return (
  <>
    
      Array.from(Array(Math.round(options.length / 2)).keys()).map((number, index) => 
        return (
          <div className="row">
            
                options.slice(index * 2, (index * 2) + 2).map(option=>
                  return (
                    <div className="col-md-6">
                      <div className=`option $option.true ? 'correct-option' : 'wrong-option'`>
                        option.letter-option.text
                      </div>
                    </div>
                  );
                )
              
          </div>
        );
      )
    
  </>
);

【讨论】:

以上是关于如何使用带有条件包装的 map() 函数在 JSX 中呈现数组条目的主要内容,如果未能解决你的问题,请参考以下文章

如何在带有 React 的 Typescript/JSX 中使用带有箭头函数的泛型?

在具有包含数据帧的列表列的小标题中,如何使用自定义函数包装 mutate(foo = map2(...))?

如何在 JSX 的三元运算符中调用两个函数?

如何使用 SWIG 包装带有可变参数的 C 函数

JSX 元素类型错误:将类型添加到从 .map 函数返回的对象

如何使用依赖于包装它的较短列表的 map 循环较长的列表以将某些函数应用于 Common Lisp 中的较长列表?