【问题标题】:How to turn around the content of an array to another array with a forEach-Loop?如何使用 forEach-Loop 将数组的内容转为另一个数组?
【发布时间】:2018-06-01 16:17:25
【问题描述】:

我想知道我的代码有什么问题。 如标题中所述,我想将带有 for 循环的数组的内容转到另一个数组。我想使用 ES5,因为我还不习惯 ES6+。

这是我的代码:

    var arrayA = ["h","e","l","l","o"];
    var arrayB = [];
     function copyArray(oldArray, newArray) {
       oldArray.forEach(function() {
            var storeElement = oldArray.pop();
           newArray.push(storeElement); 
     });
       console.log(oldArray + " old array");
       console.log(newArray + " new array");
    }
    
    
    copyArray(arrayA, arrayB);

结果是:

"h,e,l,l old array"
"o new array"
"h,e,l old array"
"o,l new array"
"h,e old array"
"o,l,l new array"
"h,e FINAL old array"
"o,l,l FINAL new array"

但应该是:

"" FINAL old array
"o, l, l, e, h" FINAL new array. 

出了什么问题?

【问题讨论】:

  • let ary = ["h","e","l","l","o"].reverse(); 怎么样?
  • 为什么不直接使用.reverse()
  • 好吧。我对此一无所知。:D 我刚刚体验过 shift()、pop()、unshift() 和 push()。但无论如何;为什么我的代码方法不起作用?我想我有一个普遍的误解,为什么这个 forEach-Loop 没有正确运行,因此这个错误的有效解决方案也可以解决其他问题。
  • 我的猜测是它不起作用,因为 array.foreach() 终止太快,因为你正在修改 oldArray 的长度,而 array.foreach() 正在迭代它

标签: javascript arrays foreach ecmascript-5


【解决方案1】:

好的,所以问题是您的 forEach 没有与 oldArray length 一起运行平均 5 次 为什么会这样?这是因为您正在弹出带有forEach 的值,这改变了forEach 的长度和数据。

您可以通过将console.log(oldArray); 放入forEach 进行检查。

var arrayA = ["h", "e", "l", "l", "o"];
var arrayB = [];

function copyArray(oldArray, newArray) {
    var length = oldArray.length;
    for (var i = 0; i < length; i++) {
        var storeElement = oldArray.pop();
        newArray.push(storeElement);
    };
    console.log(oldArray + " old array");
    console.log(newArray + " new array");
}


copyArray(arrayA, arrayB);


var reverseArray = ["h", "e", "l", "l", "o"].reverse();

console.log("reverse array");

console.log(reverseArray);

【讨论】:

  • @DonOverflow 注意他是如何在循环之前将length 存储在变量中的,这可以让您在循环时更改oldArray。如果你在 for 循环中使用 i &lt; oldArray.length 作为第二个条件,你会得到与之前相同的问题
  • 谢谢你们!我将此标记为正确答案。没想到变长了。
【解决方案2】:

当你在做 pop 时,是在你的数组的一个新副本上,你不是在修改 oldArray。

【讨论】:

    【解决方案3】:

    您在迭代数组时正在更改它,因为您会得到这种响应。

    要做到这一点,你可以这样做

    var arrayA = ["h","e","l","l","o"];
    var arrayB = [];
    function copyArray(oldArray, newArray) {
      newArray = oldArray.reverse().slice();
      oldArray.length = 0;
      console.log(oldArray + " old array");
      console.log(newArray + " new array");
    }
    
    
    copyArray(arrayA, arrayB);
    

    【讨论】:

      【解决方案4】:

      您在这里遇到的是在编辑其内容时循环遍历数组。

      对于旧数组中的每个元素,您都弹出一个元素并将其推送到另一个元素上。想想当 forEach 循环在数组的第 n 个元素上并且第 n+1 个元素被弹出时会发生什么?它现在正在循环一个比以前短一个元素的数组?然后哪个元素成为 forEach 循环中的下一个元素?

      如果您想删除第一个数组中的所有元素,请使用一段时间

      while(oldArray.length !== 0){
          newArrary.push(oldArray.pop());
      }
      

      如果您想在每个元素上保留原始数组循环并将其添加到新数组中

      oldArray.forEach(function(oldArrayElement) {
          newArray.push(oldArrayElement);
      });
      

      【讨论】:

        【解决方案5】:

        正如所指出的,您可以使用反向。但是要回答您为什么这不起作用的问题:您正在修改数组,以便 forEach 循环提前退出。

        所以一种解决方案是:

        1. 不要修改您正在循环的数组
        2. 从 oldArray 中获取最后一项并将其添加到 newArray 中
        3. 然后是 oldArra 中的倒数第二项并将其添加到 newArray

        等等

        我们知道我们可以从数组中获取最后一项

        var lastItem = myArray[myArray.length-1]
        

        所以为了得到倒数第二个我们要做的事情

        var secondLastItem = myArray[myArray.length-2]
        

        我们仍然可以使用 forEach 方法,因为回调的参数很少,例如当前项和当前索引。

        所以当你遍历一个数组时,第一个索引为 0,下一次索引变为 1,等等。

        现在我们有一些随着循环继续而增加的东西,我们可以减去 1,然后减去 2,然后减去 3,等等。

        所以我们的解决方案可能是这样的;

        var arrayA = ["h","e","l","l","o"];
        var arrayB = [];
        function copyArray(oldArray, newArray) {         
            oldArray.forEach(function(item,index) {                         
                newArray.push(oldArray[oldArray.length-1-index]); 
            });
            console.log(oldArray + " old array");
            console.log(newArray + " new array");
        }
        
        copyArray(arrayA, arrayB);
        

        【讨论】:

          【解决方案6】:

          一种使用方式是推送,另一种方式是使用传播运算符,

          oldArray = ["h", "e", "l", "l". "o"];
          newArray = [];
          newArray = [...oldArray.reverse()];
          

          这是以相反顺序制作副本的最简单方法。

          【讨论】:

            猜你喜欢
            • 2022-06-17
            • 2020-02-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-10-28
            • 1970-01-01
            相关资源
            最近更新 更多