根据数据属性对子div进行排序

时间:2014-12-04 22:21:06

标签: javascript jquery html

尝试根据数据属性对子div进行排序

下面的html代码由CM生成,可以按任意随机顺序检索数据。

html代码是

<section class="box explore">
<div id="ProductContainer"  class="row">
        <div id="1232132" data-name="B" data-category="Category_A" class="explore-cell">
         <h>B</h>
         <p>Category_A</p>
        </div>
    <div id="123" data-name="A" data-category="Category_A" class="explore-cell">
        <h>A</h>
        <p>Category_A</p>
    </div>
    <div id="1232152351" data-name="C" data-category="Category_A" class="explore-cell">
        <h>C</h>
        <p>Category_A</p>
    </div>
    <div id="12342341" data-name="E" data-category="Category_B" class="explore-cell">
        <h>E</h>
        <p>Category_B</p>
    </div>
    <div id="1325321" data-name="D" data-category="Category_B" class="explore-cell">
        <h>D</h>
        <p>Category_B</p>
    </div>

</div>

的java

$('div').sort(function (a, b) {

  var contentA = $(a).attr('data-name');
  var contentB = $(b).attr('data-name');
  return (contentA < contentB) ? -1 : (contentA > contentB) ? 1 : 0;

})

Jsfiddle http://jsfiddle.net/w8gkshue/

如果有人可以直接指出我如何通过产品名称或类别进行最佳排序。

更新希望这可以提供更好的探索

4 个答案:

答案 0 :(得分:1)

您可以像这样使用.sort方法

var $wrapper = $('#ProductContainer');

$wrapper.find('.explore-cell').sort(function (a, b) {
    return a.getAttribute('data-name') > b.getAttribute('data-name');
})
.appendTo( $wrapper );

但我不确定交叉浏览支持

答案 1 :(得分:1)

编辑:我错过了jQuery标签......让答案仍然存在。

&#13;
&#13;
var productCt = document.getElementById('ProductContainer'),
    reInsertProductCt = tempRemove(productCt);


[].slice.call(productCt.children)
  .sort(function (a, b) {
    var aName = a.dataset.name,
        bName = b.dataset.name;
  
    return aName < bName? -1 : +(aName > bName);
  })
  .forEach(productCt.appendChild.bind(productCt));

reInsertProductCt();





function tempRemove(el) {
    var parent = el.parentNode,
        nextSibling = el.nextSibling;
  
    parent.removeChild(el);
  
    return function () {
        if (nextSibling) parent.insertBefore(el, nextSibling);
        else parent.appendChild(el);
    };
}
&#13;
<div id="ProductContainer"  class="row">
        <div id="1232132" data-name="B" data-category="Category_A" class="explore-cell">
         <h>TEST NAME B</h>
         <p>TEST</p>
        </div>
    <div id="123" data-name="A" data-category="Category_A" class="explore-cell">
        <h>TEST NAME A</h>
        <p>TEST</p>
    </div>
    <div id="1232152351" data-name="C" data-category="Category_A" class="explore-cell">
        <h>TEST NAME C</h>
        <p>TEST</p>
    </div>
    <div id="12342341" data-name="E" data-category="Category_B" class="explore-cell">
        <h>TEST NAME E</h>
        <p>TEST</p>
    </div>
    <div id="1325321" data-name="D" data-category="Category_B" class="explore-cell">
        <h>TEST NAME D</h>
        <p>TEST</p>
    </div>

</div>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

只调用它们实际上不会在视觉上改变DOM,它只返回一个已排序的集合。所以基本上你只需要获取集合,对其进行排序,然后将其返回。这样的事情应该有效:

$('#ProductContainer > div').detach().sort(function (a, b) {
  var contentA = $(a).data('name');
  var contentB = $(b).data('name');
  return (contentA < contentB) ? -1 : (contentA > contentB) ? 1 : 0;
}).appendTo('#ProductContainer');

您需要确保使用detach()方法而不是remove(),因为detach()将保留与集合项关联的所有数据和事件。

答案 3 :(得分:0)

为什么选择按类别或按名称排序时可以按两者排序?

我尝试编写一个通用的多端口函数生成器,它也应该与本机数组排序函数一起使用。

JSFIDDLE HERE

生成多重排序的函数,它需要两个参数。

  1. 列优先级列表顺序(首先按类别或按名称?您决定)。
  2. 我还想要一种为列提供值的方法(因为你可能不会以相同的方式为每个列检索它们),它是一个对象,它为每列描述了一个检索数据的函数。
  3. 这是

    function getMultisortFn(columns, provideColumnData) {
        return function (a, b) {
            for (var i = 0, l = columns.length; i < l; i++) {
                var column = columns[i];
                var aColumnData = provideColumnData[column.name](a, column.name);
                var bColumnData = provideColumnData[column.name](b, column.name);
                if (aColumnData !== bColumnData) {
                    if (column.asc) {
                        return String.prototype.localeCompare.call(aColumnData, bColumnData);
                    }
    
                    return String.prototype.localeCompare.call(bColumnData, aColumnData);    
                }
            }
        };
    }
    

    现在,这是您实际使用多重生成

    的部分
    function retrieveDataAttribute(item, attribute) {
        return $(item).data(attribute);
    }
    
    var $container = $('#ProductContainer'); 
    var $products = $container.find('div');
    
    var multisort = getMultisortFn([{
            name: 'category',
            asc: false
        }, {
            name: 'name',
            asc: true
        }], {
            name: retrieveDataAttribute,
            category: retrieveDataAttribute
        });
    
    
    
    $products.sort(multisort);
    

    最后是DOM操作来应用新订单

    $products.detach().appendTo($container);
    

    编辑 感谢 plalx

      $container.detach().append($products).appendTo('section.box.explore');