【问题标题】:How can I each loop through nextUntil我如何每次循环通过 nextUntil
【发布时间】:2014-10-15 14:30:24
【问题描述】:

我需要创建一个数组数组。我有一个相当广泛的 if/else 循环工作,但我认为我可以使用 jQueries nextUntil 函数对其进行重构。根据我所看到的,我走在正确的轨道上,但我的结果在两个方向上都没有达到我所需要的。

这是 HTML

var array = [[]];

<ul id="list">
    <li class="get-it">1</li>
    <li class="get-it">2</li>
    <li class="ignore-it">3</li>
    <li class="get-it">4</li>
    <li class="get-it">5</li>
    <li class="ignore-it">6</li>
    <li class="get-it">7</li>
    <li class="get-it">8</li>
    <li class="ignore-it">9</li>
    <li class="get-it">10</li>
    <li class="get-it">11</li>
</ul>

这是我尝试抓取 .get-it 列表项的几种方法

// returns single-item array of all .get-it items
array.push( $( '#list' ).children().nextUntil( '.ignore-it' );

// returns 8 single-item array of .get-it items
$row.children().nextUntil( '.ignore-it' ).each(function(){
    array.push( $(this) );
});

这是我真正需要返回的东西

// what I need returned
array = [
    [ li[0], li[1] ],
    [ li[3], li[4] ],
    [ li[6], li[7] ],
    [ li[9], li[10] ]
]

【问题讨论】:

  • 你也不需要[ li[9], li[10] ]
  • @NominalAeon 你不希望你的数组有子数组吗?
  • 是的,我愿意。为什么,我最后写错了?

标签: jquery arrays nextuntil


【解决方案1】:

这将起作用:

var array = $('.get-it:first, .ignore-it + .get-it').map(function() {
    return $(this).add($(this).nextUntil('.ignore-it'));
}).get();

JSFiddle

基本上是这样工作的:

// grab the first .get-it, as well as all .get-it
// elements that follow an .ignore-it element
$('.get-it:first, .ignore-it + .get-it')

// map each of those items into an array that contains
// itself, plus all .get-it elements up until the next
// .ignore-it element
.map(function() {
    return $(this).add($(this).nextUntil('.ignore-it'));
})

// convert our jQuery collection into a regular array
.get();

【讨论】:

  • 是的,我认为这是在做的事情!我正在插入,使用 nuxtUntil 的奖励积分*。 *没有实际奖励积分。
  • 这是捕捉单打,但也是双打。我无法辨别出它的真正模式。我试着把它分成两个调用 $('.get-it:first') 和 $('.ignore-it + .get-it'),所以我把它缩减为后者的错。更多内容
  • 不确定我是否关注。它失败的模式是什么?
  • 你能给我一个链接到更新的jsfiddle.net/x1ewcfLk 并带有导致它失败的标记吗?
  • 也许我误解了你,但这就是你所说的标记模式(jsfiddle.net/x1ewcfLk/1)?据我所知,代码也可以正常工作。
【解决方案2】:

你可以这样做

var array = [], tempArr = $('#list > li.get-it').map(function(){ return $(this); });
while(tempArr.length > 0)
   array.push(tempArr.splice(0, 2));  // splice it into two

DEMO

上面所做的是获取元素并将它们分成两部分。

【讨论】:

  • 这很干净。只有一个(潜在的)警告是它当然仅限于在.ignore-it 之前总是有两个.get-it 的标记。从问题中不清楚这是否是保证。
  • 谢谢,我应该把它放在原来的帖子里,但我需要考虑.ignore-it之间的varialbe项目长度。有时有两个,有时有五个。
猜你喜欢
  • 2021-07-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-19
  • 2013-02-03
相关资源
最近更新 更多