【问题标题】:Jquery script that parses HTML into JSON array not appending in correct order将 HTML 解析为 JSON 数组的 Jquery 脚本未按正确顺序附加
【发布时间】:2015-10-22 09:17:04
【问题描述】:

大家好,我使用下面的脚本从另一个页面获取 html table 并将其转换为 json array,然后我将其附加到带有参数的新闻源中,但由于某种原因,事情的顺序变得混乱了2-3 个没有意义的项目...我想解决这个问题,并告诉我的脚本只附加最后 10 个项目,我该如何做到这一点?

JS:

$.get( "http://support.jonar.com/support/default.asp?W2423", function(data) {
  var frag = document.createRange().createContextualFragment(data);
  var tbl = (frag.querySelector('.newsfeedtable'));
  document.body.appendChild(tbl);
  var data = $(tbl).tableToJSON();
  tbl.parentNode.removeChild(tbl);


  data.reverse().sort(function(a, b) {
    return a.priority < b.priority || Array.prototype.slice(-5);
  }).forEach(function(d, i) {
    var title = d.title;
    var link = d.link;
    var date = d.date;
    var type = d.type;
    var location = d.location;
    var priority = d.priority;
    if (priority == '1') {
        $('ul.nflist').prepend($('<li>', {
            html: '<a href="' + link + '" target="_blank">' + title + '</a> ' + ' ' + '<span class="category">' + type + '</span>'
        }));
    } else if (location === 'customer_and_partner_portal') {
        $('ul.nflist').append($('<li>', {
            html: '<a href="' + link + '" target="_blank">' + title + '</a> ' + ' ' + '<span class="category">' + type + '</span>'
        }));
    }
    else if (location === 'customer_portal') {
        $('ul.nflist').append($('<li>', {
            html: '<a href="' + link + '" target="_blank">' + title + '</a> ' + ' ' + '<span class="category">' + type + '</span>'
        }));
    }
  });

  //First hide the category tag...
  $(".category").hide();
  // Now lets search for categories and add images
    $('ul.nflist li:contains("social_media")').prepend('<img src="http://www.jonar.com/portal/customer/img/icons/socialmedia.png" />');
    $('ul.nflist li:contains("blog")').prepend('<img src="http://www.jonar.com/portal/customer/img/icons/blogicon.png" />');
    $('ul.nflist li:contains("announcement")').prepend('<img src="http://www.jonar.com/portal/customer/img/icons/announcementnews.png" />');
    $('ul.nflist li:contains("press")').prepend('<img src="http://www.jonar.com/portal/customer/img/icons/inthepress.png" />');
    $('ul.nflist li:contains("paragon")').prepend('<img src="http://www.jonar.com/portal/customer/img/icons/ParagonUpdate.png" />');
    $('ul.nflist li:contains("event")').prepend('<img src="http://www.jonar.com/portal/customer/img/icons/events.png" />');
    $('ul.nflist li:contains("partner")').prepend('<img src="http://www.jonar.com/portal/customer/img/icons/partnerupdate.png" />');
    $('ul.nflist li:contains("wiki")').prepend('<img src="http://www.jonar.com/portal/customer/img/icons/wikiUpdate.png" />');
        // Now if there is an alert please make it red!
    $('ul.nflist li:contains("alert")').addClass("ALERT").prepend('<img src="http://www.jonar.com/portal/customer/img/icons/ALERT.png" />');
});

脚本效果很好,我只想在json array 中附加最后 10 个项目。我知道它的array.prototype,slice(-10),但不知道如何应用它。

这是表格的样子:

http://jsfiddle.net/sxk0k8kh/

如您所见,文档有一个订单,但在下图中您看到它没有遵循... 表中倒数第二个项目位于错误的位置,并且发生在两个其他。下面是输出的图像。

【问题讨论】:

  • 很难说发生了什么以及你想要完成什么
  • 很简单,附加项目的顺序不正确......我的js很干净,我不知道发生了什么。查看输出图像和 html 表格,您会发现它们出现的顺序不正确@Adjit
  • 您按优先级对数组进行排序,但具有相同优先级的元素的最终顺序未定义。
  • 是的,但在你拥有sort(function(a, b){}之前。
  • 尝试不使用sort()data.reverse().forEach()。请注意,您总是在元素前面加上优先级 1。因此,如果有多个这样的元素,它们将再次被反转。

标签: javascript jquery html arrays json


【解决方案1】:

您的数据项使用.sort() 按优先级排序。排序后具有相同优先级的元素的最终顺序未定义。

由于您只有两个优先级选项:01,因此您可以删除 sort()

data.reverse().forEach(function(d, i) {
    //...
  });

但是,如果有多个优先级为1 的元素,它们将再次被反转。

它可以做得更聪明。可以为所有元素分配顺序索引:

data.forEach(function(d, i) {
    // store inside elements their initial order
    d.idx = i;
})

现在该数组可以按优先级排序,但是对于相同的优先级,我们可以检查初始顺序索引:

// sort taking into accound initial order
data.sort(function (a, b) {
    if (parseInt(a.priority) == parseInt(b.priority))
        return b.idx - a.idx; // reverse order of elements with same priority

    // move elements with higher priority on top
    return parseInt(b.priority) - parseInt(a.priority);
});

如果元素a 分别低于、等于或高于b,则比较函数应返回负值、零或正值。因此,优先级的字符串值应转换为整数。

不需要调用.reverse(),因为排序时已经考虑了订单索引。只使用.append() 为每个循环执行主循环,因为优先级较高的元素优先:

data.forEach(function(d, i) {
    //...
    //    $('ul.nflist').append(...);
})

【讨论】:

  • 你能把所有这些项目添加到我发布的 JS 脚本中吗 :)
  • euhm..由于某种原因它不能正常工作..它在顶部添加了优先级,但相反的顺序不起作用!
  • @RajaSharma 我被您最初的比较功能误导了。现在它已修复:jsfiddle.net/orest_h/hkqp0dzr/3 因此,添加了排序索引、固定排序功能以及使用append 而不是prepend 的初始循环。
猜你喜欢
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 2011-10-26
  • 2018-02-09
  • 2017-06-04
  • 1970-01-01
  • 2013-08-18
相关资源
最近更新 更多