繁体   English   中英

如何对数组中的嵌套 object 进行排序?

[英]How to sort nested object in an array?

由于某种原因,我被困在这个问题上。 当有一个简单的数组时,我知道如何使用.sort。 我不太确定如何使用 object 中的变量对数组中的嵌套 object 进行排序。 我可以对其进行排序,但我不确定如何显示它。

这是我正在使用的。 我从数据库和 map 获取数据以显示它。 一切都按预期工作。 现在我想获取这些数据并按艺术家对其进行排序。

这是我正在使用的代码。

export default function ShowRecords() {
  const classes = recordFormStyles();
  const url = " http://localhost:5000";

  //get userData state to use in useEffect

  //set state for showing records in database and opening/closing modals

  const [newRecords, newRecordData] = React.useState([]);

  const [editOpen, handleEditModal] = React.useState(false);

  const [addModalOpen, handleAddModal] = React.useState(false);

  //set state for edit records

  const [title, setTitle] = React.useState("");

  const [artist, setArtist] = React.useState("");

  const [rating, setRating] = React.useState("");

  const [genre, setGenre] = React.useState("");

  const [description, setDescription] = React.useState("");

  const [userId, setUserId] = React.useState("");

  //set state for favorite icon

  const [favorite, setFavorite] = React.useState([]);

  const fetchFavoriteData = async () => {
    const result = await axios.get(url + "/favorite/get", authToken);

    setFavorite(result.data);
  };

  const addFavorites = async (_id, title, artist, rating, genre, description, isFavorite) => {
    const favorites = {
      userId: _id,
      title,
      artist,
      rating,
      genre,
      description,
      isFavorite
    };

    const result = await axios.post(
      url + "/favorite/add",
      favorites,
      authToken
    );

    setFavorite(result.data);
    
  };

  const deleteFavorite = async (title) => {
    await axios.delete("http://localhost:5000/favorite/delete", {
      data: { title: title },
      authToken,
    });
  };

  //functions to control state

  const handleAddModalOpen = () => {
    handleAddModal(true);
  };

  const handleCloseAddModal = () => {
    handleAddModal(false);
  };

  const handleIsEditModalClose = () => {
    handleEditModal();
  };

  //fetch record data

  const fetchData = async () => {
    const result = await axios.get(url + "/record/get", authToken);
    newRecordData(result.data);
  };

  React.useEffect(() => {
    fetchData();
    fetchFavoriteData();
    
  }, []);

  // delete records

  const deleteRecord = async (_id) => {
    const deleteRecords = {
      _id: _id,
    };

    await axios.delete(url + "/record/" + _id, deleteRecords).then((result) => {
      const refresh = newRecords.filter((result) => result._id !== _id);
      newRecordData(refresh);
    });
  };

  //functions for controlling edit record state

  const editRecord = (_id, title, artist, rating, genre, description) => {
    setUserId(_id);
    setTitle(title);
    setArtist(artist);
    setRating(rating);
    setGenre(genre);
    setDescription(description);
    handleEditModal(true);

    console.log(title);
  };

  //functions for setting favorite state and color and post request to add favorite

  return (
    <div>
      {/* set props */}

      <Favorites />
      <AddRecord
        isAddModalOpen={addModalOpen}
        handleIsAddModalClose={handleCloseAddModal}
        addNewRecords={newRecords}
        handleIsAddModalOpen={handleAddModal}
        refreshRecordData={newRecordData}
      />
      <EditRecords
        editModalOpen={editOpen}
        handleCloseEditModal={handleIsEditModalClose}
        editUserId={userId}
        editTitle={title}
        editArtist={artist}
        editRating={rating}
        editGenre={genre}
        editDescription={description}
        editTitleState={setTitle}
        editArtistState={setArtist}
        editRatingState={setRating}
        editGenreState={setGenre}
        editDescriptionState={setDescription}
        editUrl={url}
        editFetchData={fetchData}
        editNewRecordData={newRecordData}
      />
      <Button
        className={classes.addButton}
        onClick={() => handleAddModalOpen(true)}
      >
        Add Record
      </Button>

      <div className={classes.cardsContainer}>
        <Grid container spacing={8} style={{ padding: 80 }} justify = "center">
          {newRecords.length > 0 &&
            newRecords.map((element) => (
              <RecordCard
                key = {element._id}
                element={element}
                editRecord={editRecord}
                deleteRecord={deleteRecord}
                addFavorites = {addFavorites}
                deleteFavorite = {deleteFavorite}
                favorite = {favorite}
              />
            ))}
        </Grid>
      </div>
    </div>
  );
}

我在我的 uesEffect 中获取数据,我想使用 Arist 名称对其进行排序。 我只是不确定如何做到这一点。 我找不到太多谷歌搜索。

在将数据保存到state之前对数据进行排序。 排序 function 可以接受返回 -1、0、1 的 function 以确定应如何排序。 下面的示例使用localeCompare function 按艺术家排序。

 let data = [ { artist: 'john', record: '1' }, { artist: 'mary', record: '2' }, { artist: 'bob', record: '3' } ]; let sorted = data.sort((a,b) => (a.artist.localeCompare(b.artist))); console.log(sorted);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM