javascript - 如何将 JSON 排序为值 a-z - React Native

标签 javascript reactjs sorting react-native search

我在这个标题中看到了类似的问题,但它们与我需要的非常不同。
我正在尝试对 JSON 进行排序,因此当我“查找”/搜索它时,它将按 a-z 的顺序查找值。

例如,当我搜索 Song_Name:“The” 时,它会按此顺序为我提供这些结果 - The Beatles...、The Clash...、The Doors ...,滚石乐队。
我的 JSON 看起来像这样:

 [{"Song_ID":"6","Song_Name":"Zsis - Champagne Supernova","Song_File":"http://songs/Oasis_Champagne_Supernova.mp3","Image":"http://artists_images/Oasis.jpg"},{"Song_ID":"8","Song_Name":"Oasis - Don't Look Back In Anger","Song_File":"http://songs/Moses_Dont_Look_Back_In_Anger.mp3","Image":"http://artists_images/Oasis.jpg"},{"Song_ID":"10","Song_Name":"The Rolling Stones - Like A Rolling  Stone","Song_File":"http://songs/Rolling_Stones_Like_A_Rolling Stone.mp3","Image":"http://artists_images/Rolling_Stones_Stripped.jpg"},{"Song_ID":"11","Song_Name":"Doors - People Are Strange","Song_File":"http://songs/The_Doors_People_Are_Strange.mp3","Image":"http://artists_images/The_Doors.jpg"}]

换句话说,按照“Song_name”a-z 对其进行排序。

我尝试使用这些函数中的任何一个,但它们中的每一个都给我一个空的搜索结果(没有这些函数,搜索工作正常):

sortSongsByName = (stringSongs)=>{
  stringSongs.sort(function(a,b) {
    return b.Song_Name.toLowerCase() < a.Song_Name.toLowerCase();
  });
};


sortAllSongs = songsList => {
     songsThings(a,b) 
      a = a.Song_Name.toLowerCase();
      b = b.Song_Name.toLowerCase(); 
      return a > b ? 1 : b > a ? -1 : 0;
}


function compare(a,b) {
  if (a.Song_Name.toLowerCase() < b.Song_Name.toLowerCase())
    return -1;
  if (a.Song_Name.toLowerCase() > b.Song_Name.toLowerCase())
    return 1;
  return 0;
}


function sortThings(a, b) {
  a = a.Song_Name.toLowerCase();
  b = b.Song_Name.toLowerCase();

  return a > b ? -1 : b > a ? 1 : 0;
}

组件DidMount -

  this.state = {
         songs: [],
       };

     componentDidMount = () => {
        AsyncStorage.getItem("@MyMusic:songs").then(value => {
          let songsList = JSON.parse(value);
          songsList = JSON.stringify(songsList);
          songsList.sort(sortThings); // calling the function
          this.setState({ songs : songsList });
          });
      };
部分搜索功能——
   SearchSong = () => {  
this.songsList.sort(function (a, b) {
    return a.Song_Name.toLowerCase().localeCompare(b.Song_Name.toLowerCase());
});

console.log(songsList)
        let strKeyword = this.state.searchRes.replace(/["  "]/g, "");
        musicList = [];
        songsLength = this.state.songs.length;
        if (strKeyword == "" || strKeyword == " ") {
          return;}
        for (i = 0; i < songsLength; i++) {

调用函数后“songsList”和“songs”的console.logs为“未定义”。

-问题
我可以用这些函数对状态进行排序吗?例如-

this.setState({ song: song.sort(sortThings)});

如果需要更多代码,请告诉我。

最佳答案

您的排序函数似乎没有返回排序后的数组。您需要在 stringSongs.sort 前面放置一个 return:

sortSongsByName = (stringSongs)=>{
  return stringSongs.sort(function(a,b) {
    return b.Song_Name.toLowerCase() < a.Song_Name.toLowerCase();
  });
};

编辑:OP编辑他们的问题后,我要添加以下内容:

这些返回 undefined 的事实证实了我上面的答案。要回答是否可以使用函数的返回值来 setState 的附加问题,答案是肯定的。

关于javascript - 如何将 JSON 排序为值 a-z - React Native,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53581449/

相关文章:

java - 如何从 JavaScript 向 servlet 发送请求?

javascript - 选择要显示的随机图像

javascript - 单击屏幕上的任意位置关闭所有 Angular JS Bootstrap 弹出窗口?

jquery - 使用 CORS 响应 jQuery 请求时缺少 header

javascript - 如何从 package.json 中删除冗余/未使用的依赖项?

javascript - 用 jquery 做一个实时时间戳,不想使用 ids

javascript - 从 express 后端获取后 react 未决的 promise

python - 使用 operator.itemgetter 对字典进行排序

sorting - 根据相似性度量(例如余弦相似性等)对 Holoviews 热图的列和行重新排序

javascript - JS/JQUERY : Moving numbered table rows up and down without losing user input