цикл foreach завершается перед выполнением последнего массива - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь создать цикл foreach, удалив элементы цикла for. Но цикл foreach завершает, прежде чем выполняет весь массив. Я имею в виду последний цикл [6, 7, 6], и я ожидаю запустить еще один цикл, но он завершается. Я могу сделать это с помощью цикла for или другим способом, но на самом деле я запутался, почему он выходит перед выполнением последнего массива. Спасибо за любую помощь.

(Массив содержит нечетное количество элементов, и каждый элемент массива может быть связан с другим элементом с таким же значением, за исключением одного элемента, который остается непарным.)

function example() {
let A = [9, 3, 9, 3, 9, 7, 9, 7, 6, 7, 6];
  A.forEach(element => {
    for (let i = 0; i < A.length; i++) {
      if (i === 0) continue;

      if (A[i] === element) {
        A.splice(i, 1);
        A.shift();
        break;
      }
    }
    console.log(A);
  });

  return A[0];
}

выход:

[ 3, 3, 9, 7, 9, 7, 6, 7, 6 ]
[ 9, 7, 9, 7, 6, 7, 6 ]
[ 7, 7, 6, 7, 6 ]
[ 6, 7, 6 ]
6


expected:

[ 3, 3, 9, 7, 9, 7, 6, 7, 6 ]
[ 9, 7, 9, 7, 6, 7, 6 ]
[ 7, 7, 6, 7, 6 ]
[ 6, 7, 6 ]
[7]
7

Ответы [ 3 ]

0 голосов
/ 15 октября 2019

Это из-за использования shift. Я думаю, вы хотели знать, почему это происходит, а не как это решить, верно? Вы можете найти решения, основанные на ваших требованиях, но прочитайте, прежде чем решать их, используя кусок кода.

Вы можете прочитать официальный документ веб-документов MDN о том, как работает shift(), Array.forEach().

MDN web Docs :: forEach()

элементы, которые были удалены до посещения, не посещаются. Если уже посещенные элементы удаляются (например, с помощью shift ()) во время итерации, более поздние элементы будут пропущены

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

Вы можете проверить следующий код и некоторые журналы консоли:

function example() {
let A = [9, 3, 9, 3, 9, 7, 9, 7, 6, 7, 6];
A.forEach((element, index) => {

    // if you look carefully
    // last index for this array will be 3
    // means, it has already visited 4 items
    // so, after shifting one more location
    // it will stop

    console.log(index);

    for (let i = 0; i < A.length; i++) {
        if (i === 0) continue;

        if (A[i] === element) {
            A.splice(i, 1);
            A.shift();
            break;
        }
    }

    // this console log will tell you
    // that it has 3 items left in
    // this container

    console.log(A);
  });

return A[0];
}

console.log(example())

Вывод:

Current Index:  0
[ 3, 3, 9, 7, 9, 7, 6, 7, 6 ]
Current Index:  1
[ 9, 7, 9, 7, 6, 7, 6 ]
Current Index:  2
[ 7, 7, 6, 7, 6 ]
Current Index:  3 // look here, it means forEach() already visited 4 items
[ 6, 7, 6 ]
Final:  6

Итак, надеюсь, это поможет.

0 голосов
/ 15 октября 2019

function example() {
    let A = [9, 3, 9, 3, 9, 7, 9, 7, 6, 7, 6];
      A.forEach((element,index,array) => {
       
         console.log("before removal: "+A.length+" ["+ A+"]"+"element: "+element +"index: "+index)
  
    //splice("which index","howmany","toadd")
          if (A[index] === element) {
           A.splice(index, 1,"");
             console.log("after removal: "+A.length+" ["+ A+"]")
            
          }
          console.log(A);
        }
      
      );
     
    
    }

    example();

В этом коде я только что удалил (итеративный) индекс и вставил пустое значение в это место, чтобы размер массива не мог быть нарушен. В вашем коде ошибкой был индекс массива, индекс был обновлен, но элементы массива были смещены еще на один индекс, поэтому для индекса = 1 (массив обновился после .shift и имеет 2 с индексом 0, который никогда не будет посещаться вснова итерация).

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

0 голосов
/ 15 октября 2019

Может быть, это не лучшее решение, но оно должно работать по вашим требуемым критериям.

function example()
{
 let A = [9, 3, 9, 3, 9, 7, 9, 7, 6, 7, 6];

 for (let j = 0; j < A.length-1 ; j++)
 {
    for (let i = 1; i < A.length; i++) {

      if (A[i] === A[j])
     {
        j = j -1;
        A.splice(i, 1);
        A.shift();
        break;
      }

    }

    console.log(A);
  }

  return A[0];
}
...