我正在玩一个返回名单列表的API。我有列表显示,但我需要它按姓氏的字母顺序排序,但首先保留名字。以下是有效的代码:
const url = 'https://swapi.co/api/species/1/';
function fetchData(url) {
return fetch(url).then((resp) => resp.json());
}
function constructTableRow(data) {
const row = document.createElement('tr');
const { name, height, mass, hair_color } = data;
row.appendChild(constructElement('td', name))
row.appendChild(constructElement('td', height))
row.appendChild(constructElement('td', mass))
row.appendChild(constructElement('td', hair_color))
return row;
}
const swTable = document.getElementById('sw-table').getElementsByTagName('tbody')[0];
fetchData(url).then(data =>
data.people.forEach(personUrl =>
fetchData(personUrl).then(result => {
result.name.sort()
const row = constructTableRow(result);
swTable.appendChild(row);
})
)
);
当我将result.name.sort()
添加到最后一段代码时,它会断开并说:
Uncaught (in promise) TypeError: result.name.sort is not a function
at fetchData.then.result
这里缺少什么?
答案 0 :(得分:2)
假设name包含两个空格分隔的字符串。
这是我能想到的最小代码,可以帮助您解决问题。
function fetchData(test)
{
return {"name": test};
}
data = {people:["foo deep", "flying bar", "come and"]};
list = [];
data.people.forEach(personUrl =>{
list.push(fetchData(personUrl));
});
list.sort(function(a, b) {
var a_last_name = a.name.split(" ")[1];
var b_last_name = b.name.split(" ")[1];
if(a_last_name < b_last_name)
return -1;
else if (a_last_name == b_last_name)
return 0;
return 1;
});
答案 1 :(得分:1)
您可以尝试使用此代码按姓氏字母顺序排序
var sortedPeople= data.people.sort(function(a, b){
if(a.lastNameKey < b.lastNameKey) return -1;
if(a.lastNameKey > b.lastNameKey) return 1;
return 0;
});
sortedPeople.forEach(function(element) {
const row = constructTableRow(result);
swTable.appendChild(row);
});