Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript React中的排序_Javascript_Reactjs_Sorting - Fatal编程技术网

Javascript React中的排序

Javascript React中的排序,javascript,reactjs,sorting,Javascript,Reactjs,Sorting,我有多个动态出现的元素,标记如下: <li> <div> <input type="radio" value="abc" name="abc"> <span>ABC</span> </div> </li> <li> <div> <input type="radio" value="bcd" name="bcd"&

我有多个动态出现的元素,标记如下:

<li>
    <div>
        <input type="radio" value="abc" name="abc">
        <span>ABC</span>
    </div>
</li>
<li>
    <div>
        <input type="radio" value="bcd" name="bcd">
        <span>BCD</span>
    </div>
</li>
constructor(props) {
 super(props);

 state = {
  data: [ { name: 'abc', type: 'foo' }, { name: 'bcd', type: 'bar' }, ...],
  sortAscending: true
 }

 this.sortList = this.sortList.bind(this);
}

sortList() {
 let newData = this.state.data.sort((objectA, objectB) => {
  if (this.state.sortAscending) {
   return objectA.name - objectB.name;
  } else {
   return objectB.name - objectA.name;
  }

 this.setState({
  sortAscending: !this.state.sortAscending,
  data: newData
}

render() {
 <button onClick={ this.sortList }>Sort</button>
}
  • 基础知识
  • 卡介苗
  • 我需要的是在react中对这些元素进行排序?这里最好的方法是什么?对值、名称或范围内容进行排序以及如何进行排序

    目前我正在映射它们:

    const RadioButtonComponent = ({question, setAnswer, answer, lang}) => {
    
        const radioSingleElement = question.options.map((opt) => {
    
    
            return <li onClick={() => setAnswer(option.value)}>
            <Radio className="r-buttons" value={opt.value}} /><span>{question.useKeysForLabels ? lang[opt.label] : opt.label}</span>
            </li>
        });
    
        return (
    
            <RadioGroup name={question.name} selectedValue={answer} onChange={(value) => {setAnswer(value);}>
                <ul>
                    {radioSingleElement}
                </ul>
            </RadioGroup>
    
        )
    }
    
    const RadioButtonComponent=({question,setAnswer,answer,lang})=>{
    const radioSingleElement=question.options.map((opt)=>{
    return
  • setAnswer(option.value)}> {question.useKeysForLabels?lang[opt.label]:opt.label}
  • }); 返回( {setAnswer(value);}>
      {radioSingleElement}
    ) }
    简单地和您的
    选项
    数组

    const RadioButtonComponent = ({question, setAnswer, answer, lang}) =>
      <RadioGroup
        name={question.name}
        selectedValue={answer}
        onChange={value => setAnswer(value)}
      >
        <ul>
          {options
            .sort((opt1, opt2) => opt1.label > opt2.label) // order options alphabetically by label
            .map(option =>
              <li key={option.value} onClick={() => setAnswer(option.value)}>
                <Radio
                  className="r-buttons"
                  value={opt.value}
                />
                <span>{question.useKeysForLabels ? lang[opt.label] : opt.label}</span>
              </li>
            )
          }
        </ul>
      </RadioGroup>
    
    const RadioButtonComponent=({question,setAnswer,answer,lang})=>
    设置答案(值)}
    >
    
      {选项 .sort((opt1,opt2)=>opt1.label>opt2.label)//按标签字母顺序排列选项 .map(选项=>
    • setAnswer(option.value)}> {question.useKeysForLabels?lang[opt.label]:opt.label}
    • ) }
    简单地和您的
    选项
    数组

    const RadioButtonComponent = ({question, setAnswer, answer, lang}) =>
      <RadioGroup
        name={question.name}
        selectedValue={answer}
        onChange={value => setAnswer(value)}
      >
        <ul>
          {options
            .sort((opt1, opt2) => opt1.label > opt2.label) // order options alphabetically by label
            .map(option =>
              <li key={option.value} onClick={() => setAnswer(option.value)}>
                <Radio
                  className="r-buttons"
                  value={opt.value}
                />
                <span>{question.useKeysForLabels ? lang[opt.label] : opt.label}</span>
              </li>
            )
          }
        </ul>
      </RadioGroup>
    
    const RadioButtonComponent=({question,setAnswer,answer,lang})=>
    设置答案(值)}
    >
    
      {选项 .sort((opt1,opt2)=>opt1.label>opt2.label)//按标签字母顺序排列选项 .map(选项=>
    • setAnswer(option.value)}> {question.useKeysForLabels?lang[opt.label]:opt.label}
    • ) }

    有几种方法可以处理此问题,但最好的方法是对从中获取数据的数组进行排序。我假设您希望用户能够按升序/降序对数据进行排序。因此,您将有一个如下所示的数据数组:

    <li>
        <div>
            <input type="radio" value="abc" name="abc">
            <span>ABC</span>
        </div>
    </li>
    <li>
        <div>
            <input type="radio" value="bcd" name="bcd">
            <span>BCD</span>
        </div>
    </li>
    
    constructor(props) {
     super(props);
    
     state = {
      data: [ { name: 'abc', type: 'foo' }, { name: 'bcd', type: 'bar' }, ...],
      sortAscending: true
     }
    
     this.sortList = this.sortList.bind(this);
    }
    
    sortList() {
     let newData = this.state.data.sort((objectA, objectB) => {
      if (this.state.sortAscending) {
       return objectA.name - objectB.name;
      } else {
       return objectB.name - objectA.name;
      }
    
     this.setState({
      sortAscending: !this.state.sortAscending,
      data: newData
    }
    
    render() {
     <button onClick={ this.sortList }>Sort</button>
    }
    
    构造函数(道具){
    超级(道具);
    状态={
    数据:[{name:'abc',type:'foo'},{name:'bcd',type:'bar'},…],
    排序:对
    }
    this.sortList=this.sortList.bind(this);
    }
    sortList(){
    让newData=this.state.data.sort((objectA,objectB)=>{
    if(this.state.sortAscending){
    返回objectA.name-objectB.name;
    }否则{
    返回objectB.name-objectA.name;
    }
    这是我的国家({
    sortAscending:!this.state.sortAscending,
    数据:新数据
    }
    render(){
    分类
    }
    

    我没有尝试过,但我认为如果我犯了几个错误,您应该能够让它正常工作。如果您有任何问题,请告诉我。

    有几种方法可以处理此问题,但最好的方法是对从中获取数据的数组进行排序。我假设您希望用户能够以升序/降序的方式对数据进行排序按顺序排列。因此,您将有一个如下所示的数据数组:

    <li>
        <div>
            <input type="radio" value="abc" name="abc">
            <span>ABC</span>
        </div>
    </li>
    <li>
        <div>
            <input type="radio" value="bcd" name="bcd">
            <span>BCD</span>
        </div>
    </li>
    
    constructor(props) {
     super(props);
    
     state = {
      data: [ { name: 'abc', type: 'foo' }, { name: 'bcd', type: 'bar' }, ...],
      sortAscending: true
     }
    
     this.sortList = this.sortList.bind(this);
    }
    
    sortList() {
     let newData = this.state.data.sort((objectA, objectB) => {
      if (this.state.sortAscending) {
       return objectA.name - objectB.name;
      } else {
       return objectB.name - objectA.name;
      }
    
     this.setState({
      sortAscending: !this.state.sortAscending,
      data: newData
    }
    
    render() {
     <button onClick={ this.sortList }>Sort</button>
    }
    
    构造函数(道具){
    超级(道具);
    状态={
    数据:[{name:'abc',type:'foo'},{name:'bcd',type:'bar'},…],
    排序:对
    }
    this.sortList=this.sortList.bind(this);
    }
    sortList(){
    让newData=this.state.data.sort((objectA,objectB)=>{
    if(this.state.sortAscending){
    返回objectA.name-objectB.name;
    }否则{
    返回objectB.name-objectA.name;
    }
    这是我的国家({
    sortAscending:!this.state.sortAscending,
    数据:新数据
    }
    render(){
    分类
    }
    


    我没有尝试过,但我认为如果我犯了几个错误,你应该能够让它起作用。如果你有任何问题,请告诉我。

    这完全取决于你想按什么排序。我假设你想按
    值排序,尽管这是个人意见,询问这些问题对St来说是不合适的ackOverflow。你说它是动态出现的,所以我假设你通过映射数组来呈现这个html?我的建议是通过javascript对数组进行排序,然后使用.map函数呈现数组。有很多方法可以对元素进行排序。你可以对其值进行排序,然后使用纯
    JavaScri的有序值呈现html内容pt
    。请看这个问题:。这完全取决于您想按什么对它们进行排序。我假设您想按
    值对它们进行排序,尽管这是一个个人意见,但对于StackOverflow来说,询问这些内容将是离题的。您说这是动态的,所以我假设您通过映射数组来呈现此html?我的建议n是通过javascript对数组进行排序,然后使用.map函数呈现数组。有许多方法可以对元素进行排序。您可以对其值进行排序,然后使用纯
    javascript
    的有序值呈现HTML内容。请参见此问题:。您能再看一看我的问题吗?我添加了如何映射它们。@Camila我保留我的解释更新。现在刚适应你的代码:)你能再看看我的问题吗?我添加了如何映射它们。@卡米拉我保留我的解释。现在刚适应你的代码:)我添加了整个内容,所以你能再看一看我是如何映射的,以及如何在其中包含排序吗?我有点不清楚你想要的是什么,如果你要问的是如何在映射之前对项目进行排序,那么只需像这样排序:options=question.options.sort((a,b)=>{return b-a;});然后是options.map,就像您所做的那样。您的问题.options数组只是一个常规数组,因此您可以像其他数组一样排序。每当它呈现该组件时,它都会进行排序,我希望它只呈现一次。然后我建议您在服务器端对数据进行排序,因为我认为您在这里没有选项。您接收数据,它呈现,它呈现n排序,然后使用新的状态信息重新渲染。据我所知,解决此问题的唯一方法是在服务器端排序,然后发送预排序的数据。谢谢。我感谢您的重播!我添加了全部内容,因此您可以再看一看我是如何映射的以及我是如何