簡體   English   中英

在forEach中修改數組

[英]Modifying array within forEach

我需要在Array.forEach中間插入一些東西到數組中。 我想檢查一下JavaScript如何處理這些情況。 我期待任何事情,包括無休止的循環。 但是結果對我來說很奇怪。 您能解釋一下這里發生了什么嗎?

 var A = [0, 1, 2, 3, 4, 5, 6, 7] A.forEach(function(x) { if (x == 3) A.splice(1, 0, 'new') }) document.write(JSON.stringify(A)) 

通過觀察大量中間writeln

  1. forEach循環僅對每個原始索引查看一次-因此它必須已將數組的長度存儲在某個臨時變量中。

  2. splice線在第一個元素之后的同一位置插入“ new”。

  3. 只有在第4個位置看到“ 3”后,才會發生這種情況。

  4. 因此,在第3次迭代中,第一次插入后,您的數組如下所示:

     [ 0, "new", 1, 2, 3, 4, 5, 6, 7 ] 

    並且forEach迭代器位於元素4處-再次為“ 3”。

  5. ..從而為原始數組長度的其余部分插入“ new”。

forEach循環代碼的編寫者必須考慮到有人在后台更改數組。 比較安全的方法是復制原始數組,但是我認為這需要深度復制(您可能無法事先知道更改的深度),這可能導致大量復制。復制似乎是一個極端案例。

您得到的是預期的行為,盡管它不是真正的無盡循環-這是無用的循環。

您要在當前索引之前添加一個元素。 這使當前值發生偏移,因此您將在每次迭代中開始獲得x == 3。

這些都是無限循環的前提,但是JS forEach為其設置了上限,該上限是原始數組中存在的元素數。 無論您如何操作數組,其運行時間都不能超過原始長度的8倍。

此代碼的輸出最好地顯示了正在發生的事情:

  var A = [0, 1, 2, 3, 4, 5, 6, 7]
  A.forEach(function(x, index) {
    document.writeln('A[' + index + '] = ' + x + '<br/>');
    if (x == 3) {
      A.splice(1, 0, 'new')
    }
  })
  document.write(JSON.stringify(A));

輸出:

A[0] = 0
A[1] = 1
A[2] = 2
A[3] = 3
A[4] = 3
A[5] = 3
A[6] = 3
A[7] = 3
[0,"new","new","new","new","new",1,2,3,4,5,6,7]

好的,讓我們按步驟進行:

  1. 您的循環正常迭代,直到元素“ 3”

  2. 在元素“ 3”上,您的循環越過了數組第一個位置上的“新”,例如:[0,new,1,2,3,4,5,6,7],但是所有元素都在一個上移動位置右移,因此在循環第4個元素的下一次迭代中,再次將其“ 3”移出了位置。

  3. 他重復步驟2直到最后一個第8個元素,然后再重復4次將“ new”放在數組的第一個位置。 如果您想一次粘貼“新”,請按照以下步驟操作:

    A.forEach(function(x){
    如果(x == 3){A.splice(1,0,'new'); 中斷;}})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM