Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
DOM元素数组的Javascript拼接_Javascript_Arrays - Fatal编程技术网

DOM元素数组的Javascript拼接

DOM元素数组的Javascript拼接,javascript,arrays,Javascript,Arrays,当我调用myArray.splice时,它是未定义的。我怎样才能避免这种情况?我需要从该数组中删除一些DOM元素。问题在于querySelectorAll。。返回节点列表NodeList-不是标准JS数组 可能您想要的是以下内容: var myArray = []; myArray = document.querySelectorAll('.selected'); Array.prototype.slice.call(document.querySelectorAll('.selected')

当我调用myArray.splice时,它是未定义的。我怎样才能避免这种情况?我需要从该数组中删除一些DOM元素。

问题在于querySelectorAll。。返回节点列表NodeList-不是标准JS数组

可能您想要的是以下内容:

var myArray = [];
myArray = document.querySelectorAll('.selected');
Array.prototype.slice.call(document.querySelectorAll('.selected'),  <begin>, <end>);
querySelectorAll是一个节点列表,但它不是数组,因为它不是从array.prototype继承的。要将其转换为实际阵列,您可以使用以下方式使用切片:

var arrayOfNodes = [].filter.call(document.querySelectorAll(".selected"), function(curNodeItem) {
     return shouldCurrentNodeBeRetained(curNodeItem)? true : false;
    //expanded for clarity.    
});
可以像这样使用slice,因为这是一个有意的泛型方法,这意味着它的内部实现不会检查这个值是否实际上是数组实例。因此,slice可以用于任何类似数组的对象,具有数字索引和长度属性。

返回数组,而不是数组

因此,默认情况下节点列表上没有方法

但是,您可以为节点列表创建类似方法的原型

这是一个可行的方法,它直接从DOM中删除像splice这样的元素,您可以随意修改它

var myArray = [].slice.call(document.querySelectorAll('.selected'));

在选择类的情况下,你能给我们看一下HTML代码吗?myArray是一个节点列表而不是一个普通的数组我希望你不会想象从节点列表中删除元素会从文档中删除它们。为什么要从数组中删除元素?@torazaburo,我不想这样。我只想从myArray中删除一些元素。他试图调用splice来删除元素,而不是通过slice来选择它们。当您可以简单地将节点列表转换为数组时,几乎没有必要用新的例程污染节点列表原型,尤其是可枚举的例程。此外,OP表示他不希望从DOM中删除元素。最后,此实现与Array.splice API不同,它不处理添加新元素的附加参数。很好,请注意。抱歉,我没有提到对象必须留在DOM中。不管你如何澄清你评论的第一部分,我的意思是这个问题几乎总是通过将节点列表转换成数组来解决;然后可以直接使用现有的Arraysplice。您的解决方案可以很好地工作,但我怀疑您是否希望将所有数组方法都放在NodeList上,这就是它将引导您的方向。@torazaburo我同意。霍维尔。你建议我编辑我的解决方案吗?我会说MDN展示了它,而不是建议它,它给出了一个警告,扩展DOM是危险的,但这仍然是一种方法,所以不,我认为你不必编辑它。
var myArray = [];
myArray = document.querySelectorAll('.selected');

//This is a primitive analogue of splice without adding new elements, it will not remove element from NodeList, however will remove it directly from dome, then it will return the resulting array (As Array), because NodeList is unmodifiable;
NodeList.prototype.splice = function(pos, numToRemove){
    var initRemCount = remCount = numToRemove ? numToRemove : 1;
    var removed = [];
    for(var i = 0; i < this.length; i++){
        if(!remCount)
            break;
        var elm = this[i];
        if(i >= pos){
            //elm.parentElement.removeChild(elm); //I commented this out, 'cause you say you dont want to delete members from DOM, uncomment this to do so
            remCount--;
        }
    }
    return [].slice.call(this, pos, pos + initRemCount); 
}

var resultArray = myArray.splice(2, 2);

//This is the Araay already not a NodeList
console.log(resultArray);