2015-12-29 2 views
1

Я читал красноречивую книгу, сделал небольшое задание и наткнулся на то, что я не могу понять. почему return дает один ответ, а console.log - другой?ReverseArrayInPlace Странная ошибка?

function reverseArrayInPlace(r){ 
var z = []; 
    for(var c = (r.length)-1;c>=0;c--){ 
    z.push(r[c]); 
    } 
    console.log(z); 
return z; 
} 


var arrayValue = [1, 2, 3, 4, 5]; 
reverseArrayInPlace(arrayValue); 
console.log(arrayValue); 
// → [5, 4, 3, 2, 1] 

Результат:

[5, 4, 3, 2, 1] < - console.log (г)

[1, 2, 3, 4, 5] < - возврат z

+1

Если вы действительно хотите изменить массив на месте, вы можете просто сделать 'arr.reverse()'? – adeneo

+0

Да, но не хотел использовать его сейчас, просто изучая. thx tho! –

ответ

2

Вы не реверсируете массив на месте. Вы создаете новый массив, возвращаемый reverseArrayInPlace

EDIT: РЕШЕНИЕ

Вместо того чтобы создавать новый массив и возвращает его, просто заменить содержимое исходного массива с одним вы обращены с помощью этого линия в конце вашей функции:

r.splice.apply(r,[0,r.length].concat(z)) 

Эта строка удаляет все элементы из массива r и заменяет их все элементы из массива z, а затем вы можете просто вернуть r

function reverseArrayInPlace(r){ 
var z = []; 
    for(var c = (r.length)-1;c>=0;c--){ 
    z.push(r[c]); 
    } 
    console.log(z); 
    r.splice.apply(r,[0,r.length].concat(z)); 
    return r; 
} 


var arrayValue = [1, 2, 3, 4, 5]; 
reverseArrayInPlace(arrayValue); 
console.log(arrayValue); 
0

Чтобы изменить массив "на месте" работа на исходном массиве, а не создавать новую:

function reverseArrayInPlace(r) { 
 
    var t, i, j; 
 
    for(i = 0, j = r.length - 1 ; i < j ; i++, j--) { 
 
    t= r[i]; 
 
    r[i]= r[j]; 
 
    r[j]= t; 
 
    } 
 
} 
 

 
var arrayValue = [1, 2, 3, 4, 5]; 
 
reverseArrayInPlace(arrayValue); 
 
console.log(arrayValue);

0

z не тот же массив, как arrayValue , Внутри вашей функции вы создаете новый массив, называемый z, где вы найдете pusharrayValue Элементы в обратном порядке. Вместо этого, я мог бы предложить следующее:

function reverseArrayInPlace(r){ 
    var aux; 
    for(var c = 0; c < r.length/2; c++){ 
     aux = r[c]; 
     r[c] = r[r.length - 1 - c]; 
     r[r.length - 1 - c] = aux; 
    } 
} 

массивы передаются по ссылке по умолчанию, поэтому, если вы звоните reverseArrayInPlace(arrayValue), то после того, как она выполняется, arrayValue будет в обратном порядке. Обратите внимание, что вы перемещаете только половину массива, так как если вы пройдете весь массив, то вы вернете элементы обратно.