如何用forEach-Loop将一个数组的内容转成另一个数组?
How to turn around the content of an array to another array with a forEach-Loop?
我想知道我的代码有什么问题。
正如标题中描述的那样,我想用 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.
出了什么问题?
好的,问题是你的 forEach
而不是 运行 oldArray
length
意思是 5 次
为什么会这样?这是因为您正在使用 forEach
弹出值,这会更改 forEach
.
的长度和数据
你可以通过在forEach
中输入console.log(oldArray);
来检查。
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);
当你做pop的时候,是在你数组的一个新副本上,你不是在修改oldArray。
您在迭代数组时正在更改它,因为您会得到这种响应。
要做到这一点,你可以这样做
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);
您在这里遇到的是在编辑数组内容时循环遍历数组。
对于旧数组中的每个元素,您弹出一个元素并将其推入另一个元素。想想当forEach循环在数组的第n个元素上,弹出第n+1个元素时会发生什么?它现在正在循环一个比以前短一个元素的数组?哪个元素成为 forEach 循环中的下一个元素?
如果您想删除第一个数组中的所有元素,请使用 while
while(oldArray.length !== 0){
newArrary.push(oldArray.pop());
}
如果您想保留原始数组循环遍历每个元素并将其添加到新数组
oldArray.forEach(function(oldArrayElement) {
newArray.push(oldArrayElement);
});
如前所述,您可以使用反向。但要回答您有关为什么这不起作用的问题:您正在就地修改数组,以便 forEach 循环提前退出。
所以一个解决方案是:
- 不要修改正在循环的数组
- 从 oldArray 中获取最后一项并将其添加到 newArray
- 然后将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);
一种使用方法是推送,另一种方法是使用传播运算符,
oldArray = ["h", "e", "l", "l". "o"];
newArray = [];
newArray = [...oldArray.reverse()];
这是以倒序制作副本的最简单方法。
我想知道我的代码有什么问题。 正如标题中描述的那样,我想用 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.
出了什么问题?
好的,问题是你的 forEach
而不是 运行 oldArray
length
意思是 5 次
为什么会这样?这是因为您正在使用 forEach
弹出值,这会更改 forEach
.
你可以通过在forEach
中输入console.log(oldArray);
来检查。
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);
当你做pop的时候,是在你数组的一个新副本上,你不是在修改oldArray。
您在迭代数组时正在更改它,因为您会得到这种响应。
要做到这一点,你可以这样做
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);
您在这里遇到的是在编辑数组内容时循环遍历数组。
对于旧数组中的每个元素,您弹出一个元素并将其推入另一个元素。想想当forEach循环在数组的第n个元素上,弹出第n+1个元素时会发生什么?它现在正在循环一个比以前短一个元素的数组?哪个元素成为 forEach 循环中的下一个元素?
如果您想删除第一个数组中的所有元素,请使用 while
while(oldArray.length !== 0){
newArrary.push(oldArray.pop());
}
如果您想保留原始数组循环遍历每个元素并将其添加到新数组
oldArray.forEach(function(oldArrayElement) {
newArray.push(oldArrayElement);
});
如前所述,您可以使用反向。但要回答您有关为什么这不起作用的问题:您正在就地修改数组,以便 forEach 循环提前退出。
所以一个解决方案是:
- 不要修改正在循环的数组
- 从 oldArray 中获取最后一项并将其添加到 newArray
- 然后将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);
一种使用方法是推送,另一种方法是使用传播运算符,
oldArray = ["h", "e", "l", "l". "o"];
newArray = [];
newArray = [...oldArray.reverse()];
这是以倒序制作副本的最简单方法。