如何获取列表按姓氏按字母顺序排序,但首先在javascript

时间:2018-04-05 18:26:12

标签: javascript arrays json es6-promise

我正在玩一个返回名单列表的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

这里缺少什么?

2 个答案:

答案 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);
});