我有以下问题:
//反向数组
编写一个接受数组的函数并将该数组反转到位。该行为应该模仿本机.reverse()数组方法的行为。但是,您的反向函数应该接受数组作为参数进行操作,而不是作为该数组上的方法调用。
不要在自己的实现中使用本机.reverse()方法。
我尝试了以下代码:
let myArray = [1, 2, 3, 4];
function reverse(myArray) {
let newArray = [];
// pop all of elements from roginal array, and store in new array
for (i=myArray.length-1; i>=0; i--){
newArray.push(myArray[i])
console.log(newArray)
}
while (newArray.length){
myArray.unshift(newArray)
}
return myArray;
}
reverse(myArray);
console.log(myArray) // expected output is [4, 3, 2, 1]
我的代码一直在运行,没有生成console.log输出。注意我想要对输入数组参数进行反向操作。
我究竟做错了什么?另外,while(newArray.length)是什么意思/它在概念上做了什么?
不知道为什么你需要unshift
你可以迭代并返回你推动值的数组
let myArray = [1, 2, 3, 4];
function reverse(myArray) {
let newArray = [];
for (i = myArray.length - 1; i >= 0; i--) {
newArray.push(myArray[i])
}
return newArray;
}
console.log(reverse(myArray))
您可以交换第一个和最后一个元素,并从最内部项开始。
function reverse(array) {
var i = array.length >> 1, // take half of the length as integer
l = array.length - 1; // last index value to calculate the other side
while (i--) [array[i], array[l - i]] = [array[l - i], array[i]];
}
var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
reverse(a);
console.log(...a);
您可以迭代数组'直到中间,并在当前(i
)和相反(length - i - 1
)之间切换:
const myArray = [1, 2, 3, 4];
function reverse(myArray) {
const length = myArray.length;
const middle = Math.floor(length / 2);
for(let i = 0; i < middle; i++) {
let tmp = myArray[i];
myArray[i] = myArray[length - i - 1];
myArray[length - i - 1] = tmp;
}
}
reverse(myArray);
console.log(myArray) // expected output is [4, 3, 2, 1]
您可以交换数组中的第一个和最后一个元素,并分别迭代地交换next和prev。
您不必访问循环中的完整集,获取中间元素并围绕该元素旋转索引
function reverseInArray(arr){
let len = arr.length;
let temp;
for(let i=0; i < len/2; i++){
temp = arr[i];
arr[i] = arr[len - i - 1];
arr[len - i - 1] = temp;
}
return arr;
}
console.log(reverseInArray([1,2,3,4,5]));
只需从数组的任一端开始交换对,直到没有剩下:
function reverse(a) {
for (let i = 0, j = a.length - 1; i < j; ++i, --j) {
let tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
return a; // not required, but allows use in an expression
}
在ES2016中,您可以使用解构分配在一次操作中执行交换,而无需使用临时变量:
function reverse(a) {
for (let i = 0, j = a.length - 1; i < j; ++i, --j) {
[ a[j], a[i] ] = [ a[i], a[j] ];
}
return a;
}
这里:
while (newArray.length){
myArray.unshift(newArray)
}
你加入myArray
,但不是从newArray
,因此无限循环。它应该是myArray.unshift(newArray.pop())
。