题解 | #表格排序#

表格排序

http://www.nowcoder.com/practice/a23d261947194d5d8e2687aa873d96e4

  function sort(type, order) {
    //type为id、price或者sales;   asc表示升序,desc为降序
    // 1.获取父节点
    var tbody = document.getElementById('jsList')
    // 2.获取数据--多少行数据
    var len = tbody.children.length
    // 3.遍历获取数组
    var domArr = []
    var typeNum = type == 'id' ? 0 : type == 'price' ? 1 : type == 'sales' ? 2 : ''
    for (let i = 0; i < len; i++) {
      domArr.push(tbody.children[i])
    }
    // 4.重新排列--js sort()
    domArr.sort((a, b) => {
      return order==='desc' ? (b.children[typeNum].innerHTML - a.children[typeNum].innerHTML) : (a.children[typeNum].innerHTML - b.children[typeNum].innerHTML)
    })
    // 5.更新节点
    domArr.forEach(item => {
      tbody.appendChild(item);
    })
  }
  • 注:刚开始写的时候第五步:更新节点,也可以达到题目要求的效果,但示例测试会报错,原来的写法如下:
    // 5.更新节点
      tbody.innerHTML = ''
      domArr.forEach(item=>{
        tbody.innerHTML += item.innerHTML;
      })//这样写只是innerHTML相同,其他参数有区别

    示例

    function test() {
      var tbody = document.getElementById('jsList');
      if (!tbody) { return false; }
      var count = 10;
      var type = 'id';
      var order = 'asc';
      var asc = order === 'asc';
      var result = createList(tbody, count);
      result.sort(function (a, b) {
        return asc ? (a[type] - b[type]) : (b[type] - a[type]);
      });
      sort(type, order);//
      var isSame = !!same(result);
      return isSame;
      //创建模拟列表
      function createList(tbody, count) {
        var result = []; var tr = document.createElement('Tr');
        var td = document.createElement('td');
        var tbody = document.getElementById('jsList');
        var ids = random(count);
        var prices = random(count);
        var sales = random(count);
        tbody.innerHTML = '';
        for (var i = 0; i < count; i++) {
          var trLine = tr.cloneNode(); var id = ids[i];
          var price = prices[i]; var sale = sales[i];
          var tdId = td.cloneNode();
          var tdPrice = td.cloneNode();
          var tdSales = td.cloneNode();
          tdId.innerHTML = id;
          tdPrice.innerHTML = price;
          tdSales.innerHTML = sale;
          trLine.appendChild(tdId);
          trLine.appendChild(tdPrice);
          trLine.appendChild(tdSales);
          tbody.appendChild(trLine);
          result.push({ id: id, price: price, sales: sale, tr: trLine });
        }
        return result;
      }
      //随机生成列表数据
      function random(count) {
        var result = []; var map = {};
        var value; for (var i = 0; i < count; i++) {
          while (!value || map[value]) {
            value = Math.floor(Math.random() * 10000 + 1);
          }
          result.push(value); map[value] = true;
        }
        return result;
      }
      //判断sort()函数是否正确?
      function same(result) {
        var trs = [].slice.call(tbody.getElementsByTagName('tr') || [], 0);
        console.log(trs);//
        console.log(result);
        if (trs.length !== result.length) {
          console.log("trs.length !== result.length");
          return false;
        }
        for (var i = 0; i < count; i++) {
          if (trs[i] !== result[i].tr) {//仅仅改变innerHTML使得trs[i]和result[i].tr不相等
            return false; 
          }
        }
        return true;
      }
    }
全部评论
为什么第五步没有先清空节点再添加也可以呢?
1 回复 分享
发布于 2021-06-24 14:49
我也想问这个问题,哈哈,这样的话不是每次排序都会在原有表格下面加上排序结果吗。。。
点赞 回复 分享
发布于 2021-06-24 15:44
写的很妙
点赞 回复 分享
发布于 2022-11-19 22:48 广东

相关推荐

10-14 23:01
已编辑
中国地质大学(武汉) Java
CUG芝士圈:虽然是网上的项目,但最好还是包装一下,然后现在大部分公司都在忙校招,十月底、十一月初会好找一些。最后,boss才沟通100家,别焦虑,我去年暑假找第一段实习的时候沟通了500➕才有面试,校友加油
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
09-30 19:49
起名星人:蛮离谱的,直接要求转投销售
投递汇川技术等公司10个岗位
点赞 评论 收藏
分享
4 收藏 评论
分享
牛客网
牛客企业服务