2

配列 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;
}

反復の最後に、z は空になるはずです。しかし、それは常に「test1」要素が残っていることを示しています。正しいインデックスがスプライスされていないので、私はやろうとしましz.splice(i--,1)たが、それもうまくいきませんでした。

これを解決する最善の方法を教えてください。

4

4 に答える 4

3

ある種の表を作成すると、非常に簡単に理解できます。問題は、最初のスプライスの後、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
            }
        }

    }
}
于 2015-08-22T22:20:57.757 に答える
3

答えが言ったように、あなたの問題は、スプライシングzがインデックスと値が配列間で整列されなくなったことを意味することです。あらゆる種類のリストから要素を削除するときに削除されたインデックスを追跡するための一般的な代替手段は、最後から最初まで反復することです。

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

function myFunction(){
    for (var i=x.length; i>0; ){
        for (var j=y.length; j> 0; ){
            if(x[--i] == y[--j]){
                z.splice(i,1);
            }
        }
    }
    document.write('"' + z.join() + '"');
}

myFunction();

また、ES5 で導入されたシンタックス シュガーの一部を使用すると、reduceRightはコードの量を減らすのに役立ちます。

function myFunction(){
  x.reduceRight(function(n, x, i) {
    y.reduceRight(function(n, y) {
      if (x == y) z.splice(i, 1)
    }, null);
  }, null)
  document.write('"' + z.join() + '"');
}
于 2015-08-22T22:35:08.800 に答える
1

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 );
        }
    }
}
于 2015-08-22T22:19:06.203 に答える
0

移動するインデックスを追跡する代わりに、次を使用して現在のインデックスを見つけることができますindexOf()

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 );
        }
    }
}
于 2015-08-22T22:23:13.463 に答える