Javascript/jQuery 组和排序组

标签 javascript jquery asp.net-mvc sorting

我目前有一系列由我们的 MVC 应用程序生成的 div。 我试图按各种“数据”属性进行排序。 我能够通过名为“data-categoryname”的属性对项目进行分组。

每个项目还有一个“data-categorysortorder”,我想在其中按该排序顺序值对“data-categoryname”创建的组进行排序。

我启动了 JS Fiddle,并对分组进行了分组,现在我需要帮助按“类别排序顺序”按类别名称对组进行排序。如有任何帮助,我们将不胜感激。

https://jsfiddle.net/c0fawcnf/9/

//CURRENTLY HAVE GROUPING BY CATEGORY ITEM NAME AND WRAPPING EACH GROUP BY CATEGORY NAME, BUT NOW NEED TO SORT EACH CATEGORY WRAPPER BY THE ITEMS 'data-categorydisplayorder'

var $item = $('.item-box'),
   items = {};

$item.each(function () {
    items[$(this).data('categoryitemname')] = '';
});

for (category in items) {
    var categoryLowerCase = category.toLowerCase();
     $item.filter('[data-categoryitemname=' + category + ']').wrapAll('<div id="' + categoryLowerCase + '" class="categoryWrapper" data-wrappercategorydisplayorder="NEED_CATEGORY_DISPLAY_VALUE_HERE_AND_SORT_BY_THIS_VALUE"></div>');
    //return list;
    $('div#' + categoryLowerCase + '').prepend('<div class="page-title"><h1>' + category.replace("-", " ") + '</h1></div>');
}


// THESE ITEMS ARE OUTPUTTED BY AN MVC APPLICATION TO THE UI - I NEED TO SORT ON THE CLIENT SIDE BASED ON PARAMETERS

<div class="item-box" data-categoryitemname="Fall" data-itemsortorder="2" data-categorydisplayorder="2">Fall Item</div>
<div class="item-box" data-categoryitemname="Fall" data-itemsortorder="0"  data-categorydisplayorder="2">Fall Item</div>
<div class="item-box" data-categoryitemname="Fall" data-itemsortorder="1"  data-categorydisplayorder="2">Fall Item</div>

<div class="item-box" data-categoryitemname="Summer" data-itemsortorder="2"  data-categorydisplayorder="1">Summer Item</div>
<div class="item-box" data-categoryitemname="Summer" data-itemsortorder="1"  data-categorydisplayorder="1">Summer Item</div>
<div class="item-box" data-categoryitemname="Summer" data-itemsortorder="0"  data-categorydisplayorder="1">Summer Item</div>

<div class="item-box" data-categoryitemname="Winter" data-itemsortorder="2"  data-categorydisplayorder="3">Winter Item</div>
<div class="item-box" data-categoryitemname="Winter" data-itemsortorder="1"  data-categorydisplayorder="3">Winter Item</div>
<div class="item-box" data-categoryitemname="Winter" data-itemsortorder="0"  data-categorydisplayorder="3">Winter Item</div>

<div class="item-box" data-categoryitemname="Spring" data-itemsortorder="1"  data-categorydisplayorder="0">Spring Item</div>
<div class="item-box" data-categoryitemname="Spring" data-itemsortorder="2"  data-categorydisplayorder="0">Spring Item</div>
<div class="item-box" data-categoryitemname="Spring" data-itemsortorder="0"  data-categorydisplayorder="0">Spring Item</div>

我对如何对项目进行排序进行了大量搜索,但发现许多对已知元素中的元素进行排序的 ID 已存在于页面上。由于我动态地将组添加到 DOM,然后在创建组后进行排序,因此我还没有真正找到有关如何执行此操作的任何内容。

更新: 我得到了附加到组元素的排序顺序值。但我的排序功能仍然不起作用。我更新了我的 JS Fiddle

https://jsfiddle.net/c0fawcnf/12/

// CURRENTLY HAVE GROUPING BY CATEGORY ITEM NAME AND WRAPPING EACH GROUP BY CATEGORY NAME, BUT NOW NEED TO SORT EACH CATEGORY WRAPPER BY THE ITEMS 'data-categorydisplayorder'

var $item = $('.item-box'),
   items = {};

$item.each(function () {
    items[$(this).data('categoryitemname')] = '';
});

for (category in items) {
    var categoryLowerCase = category.toLowerCase();
     $item.filter('[data-categoryitemname=' + category + ']').wrapAll('<div id="' + categoryLowerCase + '" class="categoryWrapper" data-wrappercategorydisplayorder="NEED_CATEGORY_DISPLAY_VALUE_HERE_AND_SORT_BY_THIS_VALUE"></div>');
    //return list;
    $('div#' + categoryLowerCase + '').prepend('<div class="page-title"><h1>' + category.replace("-", " ") + '</h1></div>');

    // GET ITEM BOX DISPLAY ORDER PROPERTY AND ATTACH IT TO THE WRAPPER CATEGORY DISPLAY PROPERTY
    var elem = $('div#' + categoryLowerCase + ' .item-box');
    elem.parent().attr("data-wrappercategorydisplayorder", elem.data("categorydisplayorder"));
}


// ATTEMPT TO SORT - BUT NOT WORKING
$('.productCategoryWrapper').sort(sort_items).appendTo('#item-grid');

//IS THIS EVEN CORRECT?
 function sort_items(a, b) {
     console.log('we shall sort');
     return ($(b).data('wrappercategorydisplayorder')) < ($(a).data('wrappercategorydisplayorder')) ? 1 : -1;
}

最佳答案

我假设您最终希望按 data-itemsortorder 值对每个组中的项目进行排序,然后首先创建一个函数,首先按 categorydisplayorder 对所有项目进行排序> 然后按 itemsortorder

function sort_items(a, b) {
    var ai = $(a).data('categorydisplayorder');
    var bi = $(b).data('categorydisplayorder');
    if (ai < bi) {
        return -1;
    } else if (ai > bi) {
        return 1;
    } else {
        ai = $(a).data('itemsortorder');
        bi = $(b).data('itemsortorder');
        if (ai < bi) {
            return -1;
        } else if (ai > bi) {
            return 1;
        } else {
            return 0;
        }
    }
}

并创建一个容器元素来插入组

<div id="container"></div>

然后安排分组和排序项目的脚本是

var groups = [];
var groupcontainer;
var items = $('.item-box');
var sorted = items.get().sort(sort_items); 
$.each(sorted, function (index, item) {
    var group = $(item).data('categoryitemname');
    if (groups.indexOf(group) == -1) {
        groups.push(group);
        var title = $('<div></div>').addClass('page-title').html($('<h1></h1>').text(group));
        groupcontainer = $('<div></div>').addClass('categoryWrapper');
        groupcontainer.append(title);
        $('#container').append(container);
    }
    container.append(item);
});

引用fiddle

关于Javascript/jQuery 组和排序组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42447937/

相关文章:

c# - ASP.NET MVC Controller 处理文件下载

asp.net-mvc - Controller 操作方法仅在第一次获取。为什么不再受到打击?

javascript - smarty 分配给 javascript 外部

jquery - 如何在左侧 div 超出屏幕的情况下左右滚动页面

javascript - 使用动画使元素可见

asp.net-mvc - 吉米博加德 : "Ajax is used very, very sparingly." Why?

javascript - JavaScript 中的表单提交按钮

javascript - 我可以将一个解构数组赋值给一个变量并解构它吗?

javascript - DOM 导航 - 使用parent还是getById?

javascript - 滚动到下一个元素