我在这个标题中看到了类似的问题,但它们与我需要的非常不同。
我正在尝试对 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/