#javascript #arrays #function #arguments #reverse
#javascript #массивы #функция #аргументы #обратный
Вопрос:
У меня следующая проблема:
// Обратный массив
Напишите функцию, которая принимает массив и переворачивает этот массив на место. Поведение должно имитировать поведение собственного метода массива .reverse(). Однако ваша функция 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]
Мой код просто продолжает выполняться, а консоли нет.создается вывод журнала. Обратите внимание, я хочу, чтобы было сделано обратное для аргумента входного массива.
Что я делаю не так? Кроме того, что означает while (newArray.length) / что это делает концептуально?
Комментарии:
1. Вы пропустили важную часть требования: «…и возвращает этот массив на место »
2. и причина, по которой ваш код «просто продолжает выполняться», заключается в вашем бесконечном цикле — ничто внутри этого цикла
while (newArray.length)
не изменяет длинуnewArray
3. Чтобы реверсировать массив на месте , вы просто меняете местами первый и последний элемент, а затем второй и предпоследний элемент и т.д., останавливаясь на полпути.
4. Я бы также предложил поменять местами. Замените i-й элемент элементом length-i.
5. Вы выбрали ответ, который приведет к сбою вашего задания.
Ответ №1:
Не уверен, зачем вам нужно 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))
Комментарии:
1. Это не реверсирование на месте!
Ответ №2:
Вы можете выполнить итерацию массива ‘до середины и переключаться между текущим ( 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]
Ответ №3:
Вы можете поменять местами первый и последний элемент в массиве и итеративно поменять местами следующий и предыдущий соответственно.
Вам не нужно просматривать полный набор в цикле, получать средний элемент и поворачивать индекс вокруг него
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]));
Ответ №4:
Вы могли бы поменять местами первый и последний элемент и начать с самого внутреннего элемента.
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);
Комментарии:
1. интересное использование структурированного присваивания для достижения замены элементов 🙂
Ответ №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;
}
Ответ №6:
Здесь:
while (newArray.length){
myArray.unshift(newArray)
}
Вы добавляете в myArray
, но не извлекаете из newArray
, следовательно, бесконечный цикл. Мне кажется, так и должно быть myArray.unshift(newArray.pop())
.