如何对反应中的对象数组进行排序并渲染它们?

How do I sort an array of objects in react and render them?

我有一个对象数组,其中包含 phone 本书的用户信息(name、lname、phone)。我无法按照我想要的顺序呈现它们,并且希望能够按姓氏排序呈现它们。我该怎么做?

我将它们呈现在 table 中,如下所示:

{persons.map((element, i) => (
   <tr key={i}>
      <td style={style.tableCell}>{ element.userFirstname }</td>
      <td style={style.tableCell}>{ element.userLastname }</td>
      <td style={style.tableCell}>{ element.userPhone }</td>
   </tr>
))}

为了向数组添加数据,我有一个表单,只要按下提交按钮,它就会将数据附加到数组。这就是我附加数据的方式:

const [persons, setPersons] = useState([
    { 
      userFirstname: "Coder", 
      userLastname: "Byte", 
      userPhone: "8885559999"
    }
  ])

  const [formData, setFormData] = useState({
    userFirstname: "",
    userLastname: "",
    userPhone: ""
  });

  const { userFirstname, userLastname, userPhone } = formData;

  const onChange = (e) => {
    setFormData({ ...formData, [e.target.name]: e.target.value })
  }

  const onSubmit = (e) => {
    e.preventDefault();
    setPersons(persons.concat({ userFirstname: userFirstname, userLastname: userLastname, userPhone: userPhone }));
  }

我需要在 map 函数之前对数组进行排序还是可以在 map 函数期间进行?

你可以这样做:

您必须安装 lodash 库:npm i --save lodash

import {sortBy} from 'lodash';


{sortBy(persons, ['userLastname']).map((element, i) => (
   <tr key={i}>
      <td style={style.tableCell}>{ element.userFirstname }</td>
      <td style={style.tableCell}>{ element.userLastname }</td>
      <td style={style.tableCell}>{ element.userPhone }</td>
   </tr>
))}

你可以在任何你想做的地方做,在状态设置期间或在渲染期间。

我会在地图中进行,即渲染为数组,因为它只是数据的混洗。这样我的原始状态列表按 'last modified' 排序,以后可能会派上用场。

因此,要按姓氏的字母顺序对它们进行排序,您可以使用 sort 方法。

{persons.sort((a,b) => a.userLastname.localeCompare(b.userLastname))).map((element, i) => (
 <tr key={i}>
    <td style={style.tableCell}>{ element.userFirstname }</td>
    <td style={style.tableCell}>{ element.userLastname }</td>
    <td style={style.tableCell}>{ element.userPhone }</td>
 </tr>
))}

我建议您在设置状态之前对数组进行排序,否则在每次渲染时它都会尝试在显示之前对其进行排序。