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

时间:2015-04-01 18:30:50

标签: javascript arrays slice

我从网页上删除了一个数组:

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

在控制台中返回一个数组: enter image description here

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

  1. 从第3项开始
  2. 然后保留每个奇数项目
  3. 所以我需要我的var的子集,其中包含第3和第5项。

    我试过了:myvar.slice(3,5)。返回错误"未定义不是函数"

    如果我成功了,我会有一个包含3个项目的数组。然后,我需要在数组中保留奇数项的子集。

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

2 个答案:

答案 0 :(得分:3)

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

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

但您可以使用applycall来获取nodelist上的数组功能。

如何获得这些功能?

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

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

但是对于你的实际问题,通过切片也不可能只获得特定标准的子集。

您必须遍历元素并手动执行。

答案 1 :(得分:2)

  

我试过了:myvar.slice(3,5)。返回错误"未定义不是函数"

是的,因为querySelectorAll返回节点列表而不是数组。另请参阅Fastest way to convert JavaScript NodeList to Array?

  

我如何为myvar进行子集,以便我有一个包含项目3和5的变量?如果myvar的长度为10.我如何将其子集化为包含项目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;
});