2015-08-22 2 views
2

У меня есть массивы x, y и z. Итерируя через x, на основании условия мне нужно продолжать удаление элементов из z. Вот что я пытаюсь сделать:Splice() не делает массив пустым

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), но это тоже не сработало.

Пожалуйста, сообщите, что это лучший способ решить эту проблему?

+0

Просто обновите ваши параметры метода сращивания, как это: z.splice (0,1); он должен работать –

+1

@AliBaig Это работает только в этом случае. Плакат пытается удалить индексы, которые совпадают в других массивах, и это не всегда будет индексом '0'. Если бы они хотели удалить все элементы, было бы проще назначить переменную новому пусту. –

ответ

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); 
     } 
    } 
} 
+0

Это предполагает, что 'z [i] === x [i]', он будет вести себя иначе, если 'var z = [" test2 "," spaghetti "," pamplemousse "];' – Paulpro

1

Вы могли бы решить ее путем отслеживания количества удаленных элементов из г:

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); 
     } 
    } 
} 
3

Это довольно легко понять, если вы создаете какой-то таблицы. Проблема заключается в том, что после первого сращивания, индекс г не как индексы х и у:

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 
      } 
     } 

    } 
} 
3

Как ответы сказали, ваша проблема в том, что сращивание г означает, что индексы и значения больше не выравниваются между массивами. Общей альтернативой отслеживанию удаленных индексов при удалении элементов из любого списка является повторение с конца до начала, например.

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() + '"'); 
} 
+0

Я думаю, что это лучшее решение , – Paulpro

+0

Благодарим всех вас за ваши предложения/решения. Решение, данное charlietfl, лучше всего подходит для меня, так как мой массив z всегда один и тот же. – Mustang

Смежные вопросы