在特定选择器后代中查找索引

Finding index within specific selector descendants

我的简化场景:

<div id="container-1" class="container">
  <div class="content">
    <div class="item selected"></div>
    <div class="item"></div>
    <div class="item"></div>
  </div>
</div>

<div id="container-2" class="container">
  <div class="content">
    <div class="item"></div>
    <div class="item selected"></div>
    <div class="item"></div>
  </div>
</div>

我需要为每个 class="container" 在 class="content" 中找到 class="selected" 的索引,所以上述场景的预期结果为:

0, 1

我正在尝试使用 jQuerys 'each' 函数实现此目的,如下所示:

$('.container').each(function()
{
  $(this).find('.item').index('.selected'); 
  $('#' + $(this).attr('id') + ' .item').index('.selected');
  $(this).find('.selected').index();
});

但我只得到 -1 个结果。

听起来你想要 .selected 在其兄弟姐妹中的索引,如果你在没有参数的元素上调用它,这就是 index 给你的。所以在你的 each:

$(this).find(".content .selected").index()

...为您提供所选元素的索引。

实例:

$(".container").each(function() {
  console.log($(this).find(".content .selected").index());
});
<div id="container-1" class="container">
  <div class="content">
    <div class="item selected"></div>
    <div class="item"></div>
    <div class="item"></div>
  </div>
</div>

<div id="container-2" class="container">
  <div class="content">
    <div class="item"></div>
    <div class="item selected"></div>
    <div class="item"></div>
  </div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

您甚至可以通过使用 map, returning the index out of the callback, and using get 将 jQuery 结果转换为真正的数组来获得这些索引的数组:

var indexes = $(".container").map(function() {
  return $(this).find(".content .selected").index();
}).get();

实例:

var indexes = $(".container").map(function() {
  return $(this).find(".content .selected").index();
}).get();
console.log(indexes);
<div id="container-1" class="container">
  <div class="content">
    <div class="item selected"></div>
    <div class="item"></div>
    <div class="item"></div>
  </div>
</div>

<div id="container-2" class="container">
  <div class="content">
    <div class="item"></div>
    <div class="item selected"></div>
    <div class="item"></div>
  </div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

我希望你想要 .selected 的索引反对它的兄弟姐妹,所以请像下面这样:-

$('.container .content').each(function(){
  console.log($(this).children('.selected').index()); 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="container-1" class="container">
  <div class="content">
    <div class="item selected"></div>
    <div class="item"></div>
    <div class="item"></div>
  </div>
</div>

<div id="container-2" class="container">
  <div class="content">
    <div class="item"></div>
    <div class="item selected"></div>
    <div class="item"></div>
  </div>
</div>

<div id="container-2" class="container">
  <div class="content">
    <div class="item selected"></div>
    <div class="item"></div>
    <div class="item"></div>
  </div>
</div>

你可以这样做,使用 Array.prototype.mapArray.prototype.reduceArray.prototype.forEach:

const index_arr = $(".container").toArray()
  .map(e=>$(e).find(".item").toArray())
  .reduce((acc, arr)=>{
    arr.forEach((e, i)=>{
      if($(e).hasClass("selected"))
        acc.push(i);
    });
    return acc;
  }, []);