首先 .slice() 然后处理所有其他元素

Posted

技术标签:

【中文标题】首先 .slice() 然后处理所有其他元素【英文标题】:First .slice() and then do things with all other elements 【发布时间】:2016-05-30 13:45:57 【问题描述】:

我很确定我已经在一些早期版本的 jQuery 中这样做了,但http://api.jquery.com/category/traversing/ 似乎不建议这样做。

我正在寻找的是与 .addBack() 相反的类似类型 - 一个使用“所有其他”元素的遍历函数(不是 .not()!)

Preusdo 示例:

$('.some-class li').slice(33,55).hide().allOthers().show()

编辑:这实际上不是一个基于 hide() / show() 的问题,这只是一个简单的例子来阐明我的意思。

首先,我想操作一组用.slice() 选择的元素,然后操作所有没有.slice() 选择的元素。

有没有我错过的方便的遍历函数可以做到这一点?我知道一般如何解决它,但是我可能错过的 ".allOthers()" 方法肯定会更方便更清晰。

【问题讨论】:

【参考方案1】:

在你的情况下,你可以在调用 slice 之前调用 show

$('.some-class li').show().slice(33,55).hide();

确实没有办法得到所有其他人,最接近的是你提到的取回他们之前的收藏,http://api.jquery.com/addback/

你可以实现一个插件,因为我在我的手机上,我会直接写一些代码

// o(n*m), could be improved
function allOthers(jqObj) 
   var current = [].concat(jqObj);
   var prev = jqObj.addBack();

   return prev.filter(function(obj)
      return !current.includes(obj);
   );


【讨论】:

@gurvinder372 我刚刚意识到我的例子有多糟糕,因为 show() / hide() 只是为了澄清,这不是我面临的实际问题(我必须分开元素,不像在这种情况下)。但是你基本上回答了我的问题,说没有方法可以实现所需的功能。 它可以作为插件实现,我正在用我的手机尝试它 你能加一个“);”在返回结束时?它丢失了,我无法编辑它,因为每次编辑需要更改超过 6 个字符;)【参考方案2】:

先显示全部,然后从33到55隐藏,这里是demo

$('.some-class li').show().slice(33,55).hide();

【讨论】:

【参考方案3】:

在测试了@JuanMendes 的建议后,我尝试了一下,发现了一种非常紧凑的方式来实现这种功能,这要归功于 jQuery 的 prevObject:

$.fn.others = function() 
  return this.prevObject.not( this );

我没有用其他方法对它进行过多测试,因此它可能需要进行一些进一步的更改 - 但它似乎至少适用于 .slice()

https://jsfiddle.net/1L3db7k4/

【讨论】:

随意接受您自己的答案,看起来比我的好;)如果您不接受,我会将您的解决方案复制到我的答案中,因为它会冒泡到顶部。 @JuanMendes 谢谢!好吧,无论如何,我不能接受我自己的答案,直到 2 天 ;) 现在我会离开你的,我会在 2 天内改变它。但是,是的,我找到了自己的答案有点不幸,哈哈。 这是最好的办法,我在SO的第一个问题也被我回答了。

以上是关于首先 .slice() 然后处理所有其他元素的主要内容,如果未能解决你的问题,请参考以下文章

Go语言:SliceHeader,slice 如何高效处理数据?

slice的比较?

常用数据处理方法汇总

slice的部分说明

winform DataGridView 大数据量 和 虚拟模式实例。该怎么处理

jquery事件冒泡