Javascript Splice()不会使数组为空

Javascript Splice()不会使数组为空,javascript,arrays,array-splice,Javascript,Arrays,Array Splice,我有数组x,y和z。 在遍历x时,根据一个条件,我需要不断从z中删除元素。以下是我正在尝试做的: var x = ["test0", "test1", "test2"]; var y = ["test0", "test1", "test2"]; var z = ["test0", "test1", "test2"]; function myFunction(){ for (var i=0; i<x.length; i++){ for (var j=0; j<

我有数组x,y和z。 在遍历x时,根据一个条件,我需要不断从z中删除元素。以下是我正在尝试做的:

var x = ["test0", "test1", "test2"];
var y = ["test0", "test1", "test2"];
var z = ["test0", "test1", "test2"];

function myFunction(){
    for (var i=0; i<x.length; i++){
        for (var j=0; j<y.length; j++){
            if(x[i] == y[j]){
                z.splice(i,1);
            }
        }

    }
document.getElementById("demo").innerHTML = z;
}
var x=[“test0”、“test1”、“test2”]; 变量y=[“test0”、“test1”、“test2”]; var z=[“test0”、“test1”、“test2”]; 函数myFunction(){
对于(var i=0;i您可以通过跟踪从z中删除的元素的数量来解决它:

var numRemoved = 0;
for (var i=0; i<x.length; i++){
    for (var j=0; j<y.length; j++){
        if(x[i] == y[j]){
            z.splice( i - numRemoved++ , 1 );
        }
    }
}
var numRemoved=0;

对于(var i=0;i来说,如果创建某种表格,就很容易理解。问题是,在第一次拼接之后,z的索引与x和y的索引不同:

x[0] = j[0] : i = 0 -> z.splice(0, 1); - test0 is removed - z = ["test1", "test2"];
x[1] = j[1] : i = 1 -> z.splice(1, 1); - test2 is removed - z = ["test1"];
x[2] = j[2] : i = 2 -> z.splice(2, 1); - nothing is removed - z = ["test1"];
解决方案:

function myFunction() {
    var removed = 0; // removed items counter
    for (var i = 0; i < x.length; i++) {
        for (var j = 0; j < y.length; j++) {
            if (x[i] == y[j]) {
                z.splice(i - removed, 1); // subtract removed counter from index
                removed++; // increment removed counter
            }
        }

    }
}
函数myFunction(){
var removed=0;//已删除项计数器
对于(变量i=0;i
使用
indexOf()


for(var i=0;i正如答案所说,您的问题是拼接z意味着索引和值不再在数组之间对齐。从任何类型的列表中删除元素时跟踪删除的索引的一个常见替代方法是从末尾到开头进行迭代,例如

var x=[“test0”、“test1”、“test2”]; 变量y=[“test0”、“test1”、“test2”]; var z=[“test0”、“test1”、“test2”]; 函数myFunction(){ 对于(变量i=x.length;i>0;){ 对于(var j=y.length;j>0;){ 如果(x[--i]==y[--j]){ z、 拼接(i,1); } } } document.write(“'+z.join()+”); }
myFunction();
只需更新拼接方法参数,如下所示:z.splice(0,1);它应该work@AliBaig这仅适用于此测试用例。海报正在尝试删除与其他数组中匹配的索引,而这并不总是索引
0
。如果他们想要删除所有元素,则更容易将变量分配给新的空数组。这假设
z[i]==x[i]
,如果
var z=[“test2”,“意大利面”,“帮宝适”];
我认为这是最好的解决方案。谢谢你们所有人的建议/解决方案。charlietfl给出的解决方案对我来说效果最好,因为我的数组z总是一样的。
for (var i=0; i<x.length; i++){
    for (var j=0; j<y.length; j++){
        if(x[i] == y[j]){
            z.splice( z.indexOf(x[i]) , 1 );
        }
    }
}