如何使我的代码对从Reddit提取为JSON文本的数据进行排序?

时间:2019-05-20 11:18:29

标签: javascript arrays json api sorting

[按属性值排列对象的数组]

我想比较支持和排序的数量,但是在理解如何从我的api到达对象“ ups”方面遇到问题。 我创建了compare函数,我想调用它。我可能将其称为错误的对象。

 function fetchData(url) {
    return fetch(url).then((resp) => resp.json());
}

function createTableRow(data) {
    const tableRow = document.createElement('tr');
    const {
        title,
        ups,
        downs,
        score,
        num_comments,
        created
    } = data;
    console.log(ups);
    tableRow.appendChild(createElement('td', title))
    tableRow.appendChild(createElement('td', ups))
    tableRow.appendChild(createElement('td', downs))
    tableRow.appendChild(createElement('td', score))
    tableRow.appendChild(createElement('td', num_comments))
    tableRow.appendChild(createElement('td', created))
    return tableRow;
}


function createElement(tag_name, text) {
    const el = document.createElement(tag_name);
    const content = document.createTextNode(text);
    el.appendChild(content);
    return el;
}

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


const butt = document.getElementById('button');

const swTable = document.getElementById('sw_table').getElementsByTagName('tbody')[0];


fetchData('https://www.reddit.com/r/funny.json')
.then(data => {
    data.data.children.forEach(result => {
    const table = createTableRow(result.data);
    swTable.appendChild(table);
   // butt.onclick(sortData(ups));
   **data.data.children.ups.sort(compare);**
});
});

错误: 未捕获(承诺)TypeError:无法读取未定义的属性“ sort”

3 个答案:

答案 0 :(得分:1)

这是您应该使用的:

fetchData('https://www.reddit.com/r/funny.json')
  .then(data => {
    const sortedResults = data.data.children.sort((a,b) => b.data.ups - a.data.ups)
    sortedResults.forEach(result => {
      const row = createTableRow(result.data);
      swTable.appendChild(row);
    })
  });
});
  • 您必须直接对结果进行排序
  • a.data.ups - b.data.ups如果a的涨幅大于b,则返回负数;如果b的涨幅大于a,则返回正数;并且如果他们有相同的起跳次数,则为0

答案 1 :(得分:0)

如果认为API以以下格式返回数据:

{
   "data": {
       children: [
          {
             title,
             ups,
             downs,
             score,
             num_comments,
             created
          }
       ]

   }
}

如下修改 then 函数将解决您的问题。

 .then(data => {
    data.data.children.sort(compare)
      .forEach(result => {
         const table = createTableRow(result);
         swTable.appendChild(table);
      })
});

答案 2 :(得分:0)

更改下面的行,

**data.data.children.ups.sort(compare);**

data.data.children.sort((a,b)=>a.ups-b.ups); // ascending

data.data.children.sort((a,b)=>b.ups-a.ups); // descending