jQuery slice否定索引不起作用

use*_*108 3 javascript arrays jquery slice

我有一个奇怪的问题,可能我在这里遗漏了一些东西.

我得到了一个元素列表,其中一部分是可见的,另一部分是不可见的.

我想选择不可见部分的最后3个元素.我添加了一个剪切来说明问题.

我正在寻找的结果是在js运行后显示10,11,12,而不是1,2,3我认为slice(-3)会给我数组的最后3个元素,但似乎我遗漏了一些东西.我使用时会发生同样的问题filter(':gt(-4)').有人能解释一下我做错了什么吗?

jQuery(document).ready(function() {
  setTimeout(function () {
    var prevs = jQuery('li').filter(':visible').first().prevAll();
    var vis = jQuery('li').filter(':visible');
    
    vis.hide(1000);
    prevs.slice(-3).show(1000);
    
  }, 1000);
});
Run Code Online (Sandbox Code Playgroud)
li:nth-last-child(n+4) {
  display: none
}

li {
  width: 30px;
  height: 30px;
  border: 1px dotted gray;
  background-color: red;
  list-style: none;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
  <li>6</li>
  <li>7</li>
  <li>8</li>
  <li>9</li>
  <li>10</li>
  <li>11</li>
  <li>12</li>
  <li>13</li>
  <li>14</li>
  <li>15</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

Nic*_*k G 6

问题是var prevs = jQuery('li').filter(':visible').first().prevAll();,具体而言prevAll().每个jquery 文档:

.prevAll()方法搜索DOM树中这些元素的前驱,并从匹配元素构造一个新的jQuery对象; 从最近的兄弟开始按顺序返回元素.

你得到的数组是元素0-11,但它们的顺序相反.所以prevs[0] == 12.最后3个元素现在是1,2和3.要解决此问题,您需要反转数组.只需将右手语句包装在里面Array.prototype.reverse.call().这就是你想要我相信的东西

jQuery(document).ready(function() {
  setTimeout(function () {
    var prevs = Array.prototype.reverse.call(jQuery('li').filter(':visible').first().prevAll());
    var vis = jQuery('li').filter(':visible');
    
    vis.hide(1000);
    prevs.slice(-3).show(1000);
    
  }, 1000);
});
Run Code Online (Sandbox Code Playgroud)
li:nth-last-child(n+4) {
  display: none
}

li {
  width: 30px;
  height: 30px;
  border: 1px dotted gray;
  background-color: red;
  list-style: none;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
  <li>6</li>
  <li>7</li>
  <li>8</li>
  <li>9</li>
  <li>10</li>
  <li>11</li>
  <li>12</li>
  <li>13</li>
  <li>14</li>
  <li>15</li>
</ul>
Run Code Online (Sandbox Code Playgroud)