同位素 - 排序元素。首先是这个,然后是那个

时间:2012-03-12 11:27:18

标签: jquery sorting jquery-isotope

这是我到目前为止工作的JSFiddle:http://jsfiddle.net/FmBFt/1/我的问题是调整演示代码来做我想做的事情。同位素文档对像我这样的noob编码器没那么有用。

解释我的需求

我正在使用ISOTOPE并且有6个类别。每个类别中都有任意数量的框。所以丁香类可能有3个盒子,绿色类别可能有8个盒子,依此类推。我有一个每个类别的链接列表。单击类别名称(例如:淡紫色类别)时,我需要具有顶部淡紫色边框的所有框按其类名“l”排序并移至顶部。然后,我希望按照添加日期的顺序对这些淡紫色框进行排序,首先显示最近的框。我希望将排序功能应用于所有类别,但实际上并不知道如何做到这一点。

我注意到你可以按“日期类别”进行排序,但所有这一切都将所有类别组合在一起,它不会像我需要的那样将某个类别移到顶部。

我不知道如何调整http://jsfiddle.net/FmBFt/1/来做我想做的事情,任何人都可以帮助我吗?

编辑:到目前为止,我有一个答案让我感到困惑,但我很确定我的问题在于我的JS中的getSortData函数:

    getSortData : {
      blogs : function( $elem ) {
        return $elem.find('.blogs');
      },
      symbol : function( $elem ) {
        return $elem.attr('data-symbol');
      },
      category : function( $elem ) {
        return $elem.attr('data-category');
      },
      number : function( $elem ) {
        return parseInt( $elem.find('.number').text(), 10 );
      },
      weight : function( $elem ) {
        return parseFloat( $elem.find('.weight').text().replace( /[\(\)]/g, '') );
      },
      name : function ( $elem ) {
        return $elem.find('.name').text();
      }
    }

上面代码中的类别调用看起来可以做到,但我只需要找出如何进行调整,此时它所做的就是将每个类别组合在一起,但我需要一次组合一个...任何人

2 个答案:

答案 0 :(得分:1)

我正在寻找另一个答案,同时寻找这个确切问题的解决方案。就我而言,按平台排序游戏。他得到了令人难以置信的技术和深度,我可以看到你迷路了。

这是我使用的getSortData中的一个元素:

flash : function ( $elem ) {
    if ($elem.find('.platform').text() == "Flash") {
        return $elem.find('.modes').text();
    } else {
        return "Z";
    }
}

我在这里做的是检查你原本只返回的价值是否是我想要的。 “闪”。如果是的话,那就完全没问题。你也可以给它0的值。然后,如果它的任何其他你返回一个值'MORE'而不是你想要的值。

所以在我的情况下,我的第一个值是Flash,然后所有其他值都设置为Z.如果你想要,你甚至可以进行多次检查。 “if elseif elseif”是为了将多个事物排序到顶部。

希望这有帮助。

答案 1 :(得分:-1)

这里涉及两个不同的部分。首先,我们有自己的排序。这是由同位素处理,没有你的业务。你需要的是第二部分:比较器。

比较器是由您定义的函数,它返回各种“键”。同位素将比较所有键并以自然方式对它们进行排序(文本按ascii排序:'1', '10', '100', '11', '2'),数字按值排序(1, 2, 10, 11, 100)。

这就是getSortData()的作用:它返回同位素可用于创建键的几个函数。排序时,您必须指定要使用的功能。如果您指定foo,那么同位素将为每个要排序的节点调用getSortData().foo(x),其中x将替换为每个节点。

创建此密钥列表后,同位素将对密钥进行排序(并使用此信息对节点本身进行排序)。

那么你需要一个好的密钥生成器。我的建议是将日期转换为毫秒,将该数字转换为字符串,并将其左括约为0.请参阅左边填充的答案:How can I pad a value with leading zeros?

如果该类为“l”,则前缀此字符串为“1”,否则为“0”:

return (cls == 'l' ? '0' : '1') + zeroFill( dateInMillis, 16 );

这将首先使用正确的类排序框('0'小于'1'),然后按日期对每种类型的框进行排序。

或者,您可以为每个框提供相同密钥的错误类(因此它们不会更改顺序):

return (cls == 'l' ? zeroFill( dateInMillis, 16 ) : 'xxx');