【问题标题】:Ordering a react map by string length?按字符串长度订购反应图?
【发布时间】:2020-05-08 16:48:10
【问题描述】:

我有一个反应函数,它遍历一个对象,并返回一个带有从地图中提取的文本字符串的按钮。我想做的是按长度顺序返回文本字符串。

构建按钮的函数在这里:

var answersS = answerState && answerState.map(({Answer, AnswerPayload, NextQuestion}, i)=>(
                    answerArray.push(Answer),
                    answerArray.sort(function(a, b){return a.length - b.length}),
                    console.log(answerArray),
                    console.log(answerState),
                    <Grid item key={i}>
                       <Button key={i} value="check" selected={determineStyle(i)} id={i.toString()} className={classes.button} variant="outlined" color="primary">{Answer}
                       </Button>
                    </Grid>
                ))
return answersS 

所以 answerState 映射返回一个如下所示的对象:

0: Object { Answer: "18-24", AnswerPayload: "1000AA", NextQuestion: 2, … }

1: Object { Answer: "25-50", AnswerPayload: "1000AB", NextQuestion: 2, … }

你明白了..

所以我正在尝试订购按钮以使最短的“答案”字符串排在第一位。

我首先尝试创建一个空数组并将值推送给它们,并使用排序按字符串长度组织项目,如下所示:

answerArray.push(Answer), answerArray.sort(function(a, b){return a.length - b.length})

这会返回正确排序的数组:

Array(8) [ "50+", "18-24", "25-50", "Skip to ACL objectives", "Skip to LCL objectives", "Skip to MCL objectives", "Skip to PCL objectives", "Skip to meniscus objectives" ]

效果很好。所以我然后尝试使用一个 forEach 函数来遍历这个数组,如下所示:

answerArray.forEach((data)=>{
    <Grid item key={i}>
        <Button key={i} value="check" selected={determineStyle(i)} id={i.toString()} className={classes.button} variant="outlined" color="primary">{data}
        </Button>
    </Grid>
})

这应该返回按钮对象,但按从最短到最长的字符串顺序,但它不返回任何内容。任何想法为什么?

【问题讨论】:

  • '...任何想法为什么?'当然,Array.prototype.forEach() 返回undefined,React 在渲染时会忽略它。因此,您需要使用Array.prototype.map() 基本上返回一个 JSX 元素数组,它将按预期呈现。还有一件事 - 将 map() 正文中的大括号 { 替换为普通大括号 ( 以便 map() 内的匿名回调将返回 JSX。

标签: javascript arrays reactjs sorting material-ui


【解决方案1】:

你忘记返回值了

answerArray.map((data)=>{
  return (<Grid item key={i}>
    <Button key={i} value="check" selected={determineStyle(i)} id={i.toString()} className={classes.button} variant="outlined" color="primary">{data}
    </Button>
   </Grid>);
});

【讨论】:

  • 谢谢@YevgenGorbunkov
  • 不客气,map() 回调的箭头符号不必显式使用 return,您可以简单地将 JSX 包装成一对大括号并摆脱 { return ... }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
相关资源
最近更新 更多