slice 在我的阵列上没有按预期工作

slice not working as expected on my array

我有一个从网页上抓取的数组:

myvar = document.querySelectorAll('#tblItineraryModuleStayDetail > tbody > tr')

在控制台里面returns一个数组:

我需要做的是子集这个数组:

  1. 从第三项开始
  2. 然后保留每奇数个项目

所以我需要我的 var 的一个子集,其中包含项目 3 和 5。

我试过了:myvar.slice(3,5)。这返回了错误 "Undefined is not a function"

如果我成功了,我会得到一个包含 3 个项目的数组。然后我需要对数组中的奇数项进行子集化。

如何为 myvar 设置子集,以便我有一个包含项目 3 和 5 的变量? 如果 myvar 的长度为 10。我如何将其子集化以包括项目 3、5、7、9?

myvar = document.querySelectorAll('#tblItineraryModuleStayDetail > tbody > tr')

myvar 是一个 nodeList 而不是数组。所以你不能在那里使用数组函数。

但是您可以使用 applycall 来获取节点列表上的数组功能。

如何获得这些功能?

Array.prototype.slice.call(myvar, 3,5);

现在您可以在节点列表中使用 slice

但是对于您的实际问题,也无法通过切片获得仅匹配特定条件的子集。

您必须遍历元素并手动完成。

I tried: myvar.slice(3,5). This returned error "Undefined is not a function"

是的,因为 querySelectorAll returns 是节点列表而不是数组。另见 Fastest way to convert JavaScript NodeList to Array?

How do I subset for myvar so that I have a variable with items 3 and 5 left in it? If myvar was length 10. How would I subset it to include items 3, 5, 7, 9?

无论如何您都需要手动执行此操作,javascript 中没有这样的方法来使用步骤对子序列进行切片。使用

var arr = [],
    myvar = document.querySelectorAll('#tblItineraryModuleStayDetail > tbody > tr');
for (var i=3; i<myvar.length; i+=2)
    arr.push(myvar[i]);

(或者,如果你想花哨的话)

var arr = Array.prototype.filter.call(document.querySelectorAll('#tblItineraryModuleStayDetail > tbody > tr'), function(_, i) {
    return i%2==1 && i>2;
});

首先你应该将你的 NodeList 结果转换为 js 中的实际数组,然后在其上使用 slice 方法。

将 NodeList 转换为 Array 的最佳方法是:

myvar = Array.from(myvar);

现在您可以轻松地在数组上使用 slice 方法:

myvar.slice(3,5);