2013-02-19 19 views
0

我知道这个问题有一个简单的解决方案,但我已经尝试解决这个问题已经有一段时间了,需要您的帮助。Javascript - 确定需要删除或添加的元素数

在我的代码中,我根据屏幕宽度对我的文章DIV进行了重新排序,并将它们包装成行并根据需要插入虚拟文章。

现在,假设我有一个包含4个文章DIV和1个dummy的jQuery集合。然后我需要知道我是否真的需要插入更多的傻瓜或删除一些。每行正确的文章数量传递给相关函数。例如,假设每行需要2篇文章。

所以,在我运行代码的布局是这样的:

| Article | Article | 
| Article | Article | 
| Dummy | 

...当它需要是这样的(冗余假人移出):

| Article | Article | 
| Article | Article | 

这是我的当前代码:

var checkForDummies  = function (unwrappedArticles, articlesPerRow) { 

     var $articles  = $(unwrappedArticles), 
      len    = $articles.length, 
      i, 
      dummiesFound = $articles.filter('.dummy-cell'), 
      dummiesNeeded = (len - dummiesFound.length) % articlesPerRow, 
      fragment  = document.createDocumentFragment(), 
      div    = document.createElement('div'); 

     // No dummies needed after removal  
     if  (dummiesNeeded === 0 && dummiesFound.length) 
      dummiesFound.remove(); 
     // No dummies needed nor found 
     else if (dummiesNeeded === 0) 
      return; 
     // Dummies needed – remove redundant dummies (max. dummies needed = dummiesNeeded) 
     else if (dummiesNeeded < dummiesFound.length) 
      dummiesFound.splice(dummiesNeeded); 
     // Dummies needed – create new ones 
     else if (dummiesNeeded > dummiesFound.length) 
      // Left out to preserve space 

    }; 

然而,这个代码将不能在布局看起来像这样(每行5篇)工作 - 因为dummiesNeeded是莫名其妙1而不是4

| Article | Article | Article | Article | Article | 
| Article | Dummy | 

任何帮助找到一个解决方案表示赞赏!谢谢!

更新的解决方案
有了明显答案的帮助下,我需要修改dummiesNeeded并插入持有签署需要假人的整数一个新的变量:

dummiesNeeded = (articlesPerRow - (len - dummiesFound.length) % articlesPerRow) % articlesPerRow, 
trueNeed  = dummiesNeeded - dummiesFound.length 
+0

那么,这个函数调用一次*每行* ?或者它应该被整个集合调用一次? – 2013-02-19 15:01:30

+0

@MattBurland它只被称为每组一次。 – micadelli 2013-02-19 15:09:06

+0

[在固定大小页面(多列)上布局内容列表的算法的可能的重复](http://stackoverflow.com/questions/8524699/algorithm-to-layout-a-table-of-contents -on-a-fixed-sized-page-multi-column) – starblue 2013-02-20 06:20:58

回答

2

我觉得你的问题是在这里:

dummiesNeeded = (len - dummiesFound.length) % articlesPerRow 

如果,在你的榜样,你有一个文章(所以LEN = 1)和一个假(所以dummiesFound.length = 1),则1-1 = 0,所以你dummiesNeeded结果是0 0%5 = 0而不是你想要的4。

当然你的dummiesNeeded应该是:

dummiesNeeded = (articlePerRow - (len - dummiesFound.length) % articlesPerRow) % articlesPerRow; 
+0

我觉得'len'实际上是这个函数中的文章总数。 (在第二个例子中是7)。虽然感觉过于复杂,但公式'(articlesPerRow - (len%articlesPerRow)+ dummiesFound.length)%articlesPerRow'似乎可行。 – 2013-02-19 15:08:30

+0

@ElliotNelson:是的,我得出了同样的结论。目前还不清楚这是被称为每行还是整个集合(因此我的问题在上面)。不过,我不知道OP为什么会用'dummiesFound'困扰。它们是否已经包含在'len'中?一点都不清楚。 – 2013-02-19 15:10:36

+0

@ElliotNelson这是正确的 - 'len'也包含虚拟元素。我可以先删除所有的虚拟物,然后重新创建它们。但是这会使一些不必要的DOM操作 – micadelli 2013-02-19 15:12:40

1

的问题确实很 (len - dummiesFound.length) % articlesPerRow

,你必须使用articlesPerRow - ((len - dummiesFound.length) % articlesPerRow)

干杯

+1

和Matt的回答一样,当'len = 3','dummiesFound = 1'和'perRow = 2'时应该是'2',当它应该是'-1(或0)'时, – micadelli 2013-02-19 15:35:36